DTO-Endpoint 验证不会将业务逻辑移动到错误的层吗?

Is DTO-Endpoint validation not moving the business logic to a wrong layer?

在 asp.net 网络中 api 模型验证是使用 DataAnnotations 或 FluentValidation 框架完成的。

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

这是上面的示例 link:

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 对象混合用于简单示例...太糟糕了...同时传递给客户端和数据库。

问题: Weight之类的东西必须在0到999之间,这不是服务层的问题,不是应用层的问题吗?

对我来说,这是业务逻辑,因为此字段类型(双精度)没有数据库限制,所以它肯定没有数据提供者逻辑。

Stuff like the Weight must between 0 and 999 does this not belong to the service layer instead of the application layer?

模型验证不一定是

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

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

对我来说,DTO 验证更像是一个合同我不会处理数据不符合我要求的形式的请求期待它。我不打算实施深度验证,但至少我收到了预期格式的所需数据。

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