DTO-Endpoint验证是否没有将业务逻辑移动到错误的层?

时间:2015-07-07 12:34:59

标签: c# validation asp.net-web-api asp.net-web-api2

在asp.net web api中,模型验证是通过DataAnnotations或FluentValidation框架完成的。

根据MS验证完成:http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

以上链接中的示例:

public class Product
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public decimal Price { get; set; }
    [Range(0, 999)]
    public double Weight { get; set; }
}

Microsoft似乎将简单的样本用于DTO / Business Model / Persistance对象的混合......可怕......它同时传递给客户端和数据库。

问题:重量必须介于0到999之间,这不属于服务层而不是应用层吗?

对我而言,这是业务逻辑,因为此字段类型(double)没有数据库限制,因此它肯定没有数据提供者逻辑。

1 个答案:

答案 0 :(得分:4)

  

重量必须在0到999之间,这不属于   服务层而不是应用层?

模型验证不一定是

例如,ASP.NET WebAPI使用模型验证来实际执行HTTP实体验证。这是一个有价值的验证,因为它意味着意外的HTTP请求可能无法到达API控制器,这很好,因为您在执行实际的逻辑之前避免执行大量代码。

由于数据注释和模型验证是跨层功能,因此您可以使用相同的数据注释属性和验证器来验证DTO和域模型,并且您不会破坏关注点的良好分离。

对我来说,DTO验证更像是合同我不会处理请求,因为它的数据不是我期望的形式。我不是要实现深度验证,但至少我收到了预期格式的所需数据。

在一天结束时,您需要确定应用于软件层的正确验证规则。也许DTO不应该验证权重应该在0到999之间,但它应该检查权重是否等于或大于0,而域层应该根据具体的域规则/规范进行验证。如果某个域要求权重小于999,请在此处添加此验证。 从DTO接收数据的任何域都不会收到负权重,而域可能会验证它是否在0到999之间。

相关问题