我可以在具有流畅验证的验证器中使用验证器吗
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");
}
}
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");
}
}