我可以在具有流畅验证的验证器中使用验证器吗

Can I have validators inside validators with fluent validation

c#伪代码

如果我有 class

class Person
{
  string Name
  date DOB
  Address address
}

我可以制作一个 PersonValidator 来验证 Person

但由于 Address 是一个复杂的类型,有时我想单独验证它,所以我有一个 PersonValidator 和一个 AddressValidator。问题是,如何在我的 PersonValidator 中使用我的 AddressValidator?

class PersonValidator : AbstractValidator<Person>
{
   PersonValidator()
   {
       RuleFor(c => c.Name).NotEmpty();

       var addressValidator = new AddressValidator();
       addressValidator.Validate( person.address ) // ???
    }
}

您可以覆盖验证方法:

public override ValidationResult Validate(ValidationContext<T> context) {
    var baseResult = base.Validate(context);
    var result = new AddressValidator().Validate(new ValidationContext<Address>(context.InstanceToValidate.Address);
    return new ValidationResult(baseResult.Errors.Concat(result.Errors));
}

对异步方法变体也执行此操作。

您可以调用 .SetValidator(IValidator) 方法。

class PersonValidator : AbstractValidator<Person>
{
   PersonValidator()
   {
       // CascadeMode = CascadeMode.StopOnFirstFailure;

       RuleFor(c => c.Name)
           .NotEmpty().WithErrorCode("name_required");

       // Checks that the IEnumerable<Address> has at least 1 item
       RuleFor(c => c.Address)
           .NotEmpty().WithErrorCode("addresses_required");

       RuleForEach(c => c.Address)
           .SetValidator(new AddressValidator());

    }
}

class AddressValidator : AbstractValidator<Address>
{
   AddressValidator()
   {
       // CascadeMode = CascadeMode.Continue;

       RuleFor(c => c.Postcode)
           .NotEmpty().WithErrorCode("postcode_required");
   }
}