2012-09-01 13 views
6

Muszę być w stanie dostarczyć IComponentContext do mojego ValidatorFactory, aby rozwiązać Validators FluentValidation. Trochę utknąłem.FluentValidation Autofac ValidatorFactory

ValidatorFactory

public class ValidatorFactory : ValidatorFactoryBase 
    { 
     private readonly IComponentContext context; 

     public ValidatorFactory(IComponentContext context) 
     { 
      this.context = context; 
     } 

     public override IValidator CreateInstance(Type validatorType) 
     { 
      return context.Resolve(validatorType) as IValidator; 
     } 
    } 

Jak mogę zapewnić kontekst i zarejestrować ValidatorFactory

FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new ValidatorFactory()); 

Odpowiedz

0

wyobraziłem to. Jeśli masz urządzenie ValidatorFactory, IComponentContext, Autofac wstrzykuje go automatycznie.

ValidatorFactory

public class ValidatorFactory : ValidatorFactoryBase 
    { 
     private readonly IComponentContext context; 

     public ValidatorFactory(IComponentContext context) 
     { 
      this.context = context; 
     } 

     public override IValidator CreateInstance(Type validatorType) 
     { 
      return context.Resolve(validatorType) as IValidator; 
     } 
    } 

Zarejestruj ValidatorFactory

FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new ValidatorFactory()); 
+3

Powinieneś podać poprawny kod w swojej odpowiedzi, a następnie zaznaczyć go jako odpowiedź. –

+0

@ErikFunkenbusch Kod jest poprawny. Przyjąłem moją odpowiedź. – Sam

9

Zamiast szczelnie para go Autofac, można zrobić to na ogół stosuje się do każdej DependencyResolver używając bezpośrednio:

public class ModelValidatorFactory : IValidatorFactory 
{ 
    public IValidator GetValidator(Type type) 
    { 
    if (type == null) 
    { 
     throw new ArgumentNullException("type"); 
    } 
    return DependencyResolver.Current.GetService(typeof(IValidator<>).MakeGenericType(type)) as IValidator; 
    } 

    public IValidator<T> GetValidator<T>() 
    { 
    return DependencyResolver.Current.GetService<IValidator<T>>(); 
    } 
} 

Następnie możesz zarejestrować swoje walidatory za pomocą każdy typ DependencyResolver jako mocno wpisany IValidator<T> i zawsze będzie rozwiązywany.

+0

Nice! Podoba mi się ... Zaznaczam twoją odpowiedź jako odpowiedź zamiast mojej tylko dlatego, że jest teraz ogólna! Dzięki – Sam

Powiązane problemy