2015-08-06 5 views
1

У меня есть приложение 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; 
     }); 
    } 
    }} 

ответ

0

это на самом деле работает. Я нашел проверенный перехватчик, о котором забыл, что не уволил мою проверку.

 Смежные вопросы

  • Нет связанных вопросов^_^