【问题标题】:FluentValidation Autofac ValidatorFactoryFluentValidation Autofac ValidatorFactory
【发布时间】:2012-09-01 05:23:30
【问题描述】:

我需要能够将IComponentContext 提供给我的ValidatorFactory 以解析FluentValidation 验证器。我有点卡住了。

验证器工厂

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

如何提供上下文并注册ValidatorFactory

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

【问题讨论】:

    标签: asp.net-mvc autofac fluentvalidation


    【解决方案1】:

    与其将它与 Autofac 紧密耦合,不如直接使用它使其普遍适用于任何DependencyResolver

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

    然后,您可以使用任何类型的 DependencyResolver 将您的验证器注册为强类型 IValidator&lt;T&gt;,并且它总是会得到解决。

    【讨论】:

    • 不错!我喜欢它...我将您的答案标记为答案,而不是我的答案,只是因为它现在是通用的!谢谢
    【解决方案2】:

    我想通了。如果你有ValidatorFactoryIComponentContext,Autofac 会自动注入它。

    验证器工厂

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

    注册ValidatorFactory

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

    【讨论】:

    • 您应该在答案中提供正确的代码,然后将其标记为答案。
    • @ErikFunkenbusch 代码是正确的。我接受了我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多