我应该如何验证 DTO?

How I'm suppose to validate a DTO?

我正在尝试使用 C# 中的 .net 创建 Web API

虽然在我的研究中我遇到过在 dtos 中放置验证代码或数据注释属性是一个很大的禁忌,但我看到的每个教程都有这行内容

[HttpPost]
public IActionResult Post(SomeDto someDto)
{
     if (ModelState.IsValid){
         //DoStuff();
     }
}

如果我没记错,ModelState.IsValid 检查参数是否满足 SomeDto dto 的验证要求。例如:

public class SomeDto    
{
    [Range(0, 10, ErrorMessage = "Price cannot be more that 10")] //this
    public decimal Price { get; set; }
}

因此我的问题是,我是否应该在 DTO 中放置数据注释或任何验证逻辑? "cleaner" 如何解决这个问题?

如果您需要实施更复杂的验证逻辑,最好使用 FluentValidator 等工具。在这种情况下,您可以分离 类 并定义自定义验证逻辑,并为操作使用验证属性或类似这样的内容:

var validationResult = new MyModelValidator().Validate(dto);

将验证逻辑与模型定义文件分开,可以以不同的方式验证 dto 的创建和更新。验证器将是这样的:

public class MyModelValidator: AbstractValidator<SomeDto>
    {
        public MyModelValidator()
        {
            RuleFor(x => x.Id)
                .Empty()
                .WithMessage(DefaultMessages.InvalidInput);

            RuleFor(x => x.Name)
                .NotEmpty()
                .WithMessage(DefaultMessages.InvalidName)
                .Length(2, 80)
                .WithMessage(DefaultMessages.InvalidName);
        }
    }