У меня есть приложение MVC, которое имеет много моделей AbstractValidator<T>
для каждого вида. Это по дизайну, потому что я использую SimpleInjector
для ввода запросов, чтобы попасть в нашу базу данных, и я не хочу иметь конструктор над инъекцией в одном валидаторе. Я создал класс ниже, который является валидатором для каждой модели представления, но он не вызывает мои When
и другие пользовательские правила проверки, вызывается только простые правила. Любая помощь будет оценена. Спасибо.MVC C# - FluentValidation Composite Validator для нескольких AbstractValidator <T>
public class CompositeValidator<T> : AbstractValidator<T>
{
private ICollection<IValidator> _validators = new List<IValidator>();
public CompositeValidator(IEnumerable<IValidator<T>> validators = null)
{
if (validators == null) return;
foreach (var validator in validators)
{
_validators.Add(validator);
var enumerator = validator.GetEnumerator();
while (enumerator.MoveNext())
{
AddRule(enumerator.Current);
}
}
}
public override ValidationResult Validate(ValidationContext<T> context)
{
var errorsFromOtherValidators = _validators.SelectMany(x => x.Validate(context).Errors);
return new ValidationResult(errorsFromOtherValidators);
}
}
Вот пример двух валидаторов
public class PersonValidator : AbstractValidator<PersonVm>
{
public PersonValidator()
{
RuleFor(model => model.FirstName).NotEmpty();
RuleFor(model => model.LastName).NotEmpty();
}
}
public class PersonMustBeRegisteredValidator : AbstractValidator<PersonVm>
{
private readonly IQuery<PersonExists> _query;
public PersonMustBeRegisteredValidator(IQuery<ReturnPerson> query)
{
_query = query;
Custom(model =>
{
var person = _query.Select(new { model.Id });
if (person == null) return new ValidationFailure("Id", "Person does not exist");
return null;
});
}
}}