Мне нужно установить порядок выполнения для проверки, чтобы он прекратил проверку после первого сбоя.
Однако это недоступно, поэтому мне интересно, какой другой способ сделать это.
Обычно у меня было бы что-то вроде этого:
public Constructor(){
// Simple validation
RuleFor(x => x.Id).NotNull().NotEmpty();
// advanced validation
// item must exist in database
RuleFor(x => x.Id).Must(ExistsInDatabase);
// item must exist in database previously
// item must be some of the allowed names -- fetched from db
RuleFor(x => x.Id).Must(BeAReferenceInSomeTable);
private bool ExistsInDatabase(){}
private bool BeAReferenceInSomeTable(){}
}
Но с этим BeAReferenceInSomeTable может быть выполнен до ExistsInDatabase. Таким образом, проверка BeAReferenceInSomeTable вызовет исключение, если Id не существует в таблице, а не сбой проверки из-за проверки ExistsInDatabase.
Чтобы решить это первое, что приходит на ум, что-то вроде этого:
public Constructor(){
CascadeMode = FluentValidation.CascadeMode.StopOnFirstFailure;
// simple validation stays the same
...
// advanced validation
RuleFor(x => x.Id)
.Must(ExistsInDatabase)
.Must(BeAReferenceInSomeTable)
.When(x => !string.IsNullOrEmpty(x.Id) &&
!string.IsNullOrEmpty(x.Name)
);
}
Но в этом случае, как мне установить правильное сообщение для проверки, поскольку сообщение должно быть предоставлено до выполнения.
.WithMessage("your message");
, чтобы добавить правильное сообщение об ошибках проверки, и это также работает с цепочкой (что вы делаете во втором примере). - person Moo   schedule 12.06.2014