FluentValidationで利用可能な方法があるかどうかを調べると、ルートレベルのバリデータに対してコレクションの検証が可能になります。FluentValidationでコレクションの新しいタイプを作成する必要がありますか?
以下に示すように、Customer
の場合、バリデーターはCustomerValidator
です。 FluentValidationを使用している 。私はList<Customer>
を持っていると私は少なくとも1人の顧客は、私はリストを検証しない方法Surname
を持つべきであることを確認する必要がある場合は
public class CustomerValidator: AbstractValidator<Customer> {
public CustomerValidator() {
RuleFor(customer => customer.Surname).NotEmpty();
RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
RuleFor(customer => customer.Address).Length(20, 250);
RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
}
private bool BeAValidPostcode(string postcode) {
// custom postcode validating logic goes here
}
}
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = results.Errors;
質問は、です。 Fluentvalidationで利用可能な機能のうち、すぐれたものがありますか?現時点では、次のいずれかの方法を考えることができます。 あなたは何が最良の方法であるとお考えですか?
1.ループ内で反復処理を行い、各顧客に対してvalidateメソッドを呼び出します。
List<ValidationResult> listOfValidationErrors = List<ValidationResult>();
// listCustomer is of type List<Customer>
foreach (var customer in listCustomer)
{
CustomerValidator validator = new CustomerValidator();
listOfValidationErrors.Add(validator.Validate(customer);
}
2.カスタマー・コレクションCustomerCollection
のための新しいコレクションクラスを作成し、CustomerCollectionValidator
public class CustomerCollection
{
public List<Customer> ListOfCustomers { get; set; }
public CustomerCollection(List<Customer> listOfCustomers)
{
this.ListOfCustomers = listOfCustomers ;
}
}
、その後、Validatorクラス
別に上記2からpublic class CustomerCollectionValidator: CompositeValidator<CustomerCollection>
{
public CustomerCollectionValidator()
{
RuleFor(x => x.ListOfCustomers)
.Must(ShouldHaveOneSurName)
.WithMessage("Should have one Surname in list");
RuleForEach(x => x.ListOfCustomers).SetValidator<CustomerValidator>();
}
public bool ShouldHaveOneSurName(List<Customer> lstCustomers)
{
if (lstCustomers== null)
{
return false;
}
return lstCustomers.Any(x => !String.IsNullOrWhiteSpace(x.SurName);
}
}