FluentValidation Autofac ValidatorFactory

后端 未结 2 2009
囚心锁ツ
囚心锁ツ 2021-02-14 17:20

I need to be able to provide the IComponentContext to my ValidatorFactory to resolve FluentValidation Validators. I am a little stuck.

Validato

相关标签:
2条回答
  • 2021-02-14 17:36

    I figured this out. If you have the ValidatorFactory take IComponentContext, Autofac injects it automatically.

    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;
            }
        }
    

    Register the ValidatorFactory

    FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new ValidatorFactory());
    
    0 讨论(0)
  • 2021-02-14 17:41

    Rather than tightly couple it to Autofac, you can make it generally applicable to any DependencyResolver by using that directly:

    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>>();
      }
    }
    

    Then you can register your validators with any type of DependencyResolver as the strongly-typed IValidator<T> and it will always end up resolving.

    0 讨论(0)
提交回复
热议问题