Search code examples
c#fluentvalidation

Can I have validators inside validators with fluent validation


c# Pseudo-code

If I have a class

class Person
{
  string Name
  date DOB
  Address address
}

I can make a PersonValidator to validate Person

but since Address is a complex type, and sometimes I want to validate it separately, I have a PersonValidator and an AddressValidator. Question is, how do I use my AddressValidator inside my PersonValidator?

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

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

Solution

  • You can invoke the .SetValidator(IValidator) method.

    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");
       }
    }