【问题标题】:Autofac with FluentValidation in MVC2在 MVC2 中使用 FluentValidation 的 Autofac
【发布时间】:2013-10-18 03:05:30
【问题描述】:

在 ValidatorFactory.CreateInstance 调用中执行期间出现“未注册错误”。看起来发送到方法中的类型是正确的。

我的注册码:

...
builder.RegisterAssemblyTypes(assembly).Where(t => t.Name.EndsWith("Validator")).As<IValidator>();
builder.Register(d => _containerProvider).As<IContainerProvider>();
builder.Register(d => new ValidatorFactory(_containerProvider.ApplicationContainer.Resolve<IContainerProvider>())).As<IValidatorFactory>();

_containerProvider = new ContainerProvider(builder.Build());

我的 ValidatorFactory 代码:

public class ValidatorFactory : ValidatorFactoryBase {
    private readonly IContainerProvider _containerProvider;

    public ValidatorFactory(IContainerProvider containerProvider) {
        _containerProvider = containerProvider;
    }

    public override IValidator CreateInstance(Type validatorType) {
        return _containerProvider.ApplicationContainer.Resolve<IValidator>(validatorType);
    }
}

我的视图模型和验证器代码:

[Validator(typeof(EmployeeViewModelValidator))]
public class EmployeeViewModel {
    public EmployeeViewModel() {}
    public EmployeeViewModel(string firstName) {
        FirstName = firstName;
    }

    public string FirstName { get; private set; }
}

public class EmployeeViewModelValidator : AbstractValidator<EmployeeViewModel> {
    public EmployeeViewModelValidator() {
        RuleFor(x => x.FirstName)
            .NotEmpty();
    }
}

我最好的猜测是我错误地注册了验证器。

【问题讨论】:

    标签: registration autofac fluentvalidation


    【解决方案1】:

    为了解决多个实现IValidator 的类,autofac documentation 展示了几种技术。我不认为您可以使用这些方法使用程序集扫描;您将单独注册验证器。

    按名称

    builder.RegisterType<EmployeeViewModelValidator>().Named<IValidator>("employee");
    
    var r = container.Resolve<IValidator>("employee");
    

    按键

    文档显示一个枚举被用作键,但您可以使用类型作为键,这样您就可以使用validatorType 调用Resolve,并在CreateInstance 方法中传递给您。

    builder.RegisterType<EmployeeViewModelValidator>().Keyed<IValidator>(typeof(EmployeeViewModelValidator));    
    
    var r = container.Resolve<IValidator>(validatorType);
    

    注意:该文档适用于 Autofac 2.3 版。我使用的是 2.2.4,这就是为什么上面的方法名称与文档不同。

    希望这会有所帮助。

    【讨论】:

    • 改名的原因反映在这个场景中——Resolve&lt;IValidator&gt;(validatorType) 具有误导性,因为validatorType 是键而不是服务类型。因此在 2.3 中这是 ResolveKeyed&lt;IValidator&gt;(validatorType) :) ... 好答案!
    【解决方案2】:

    @adrift 的另一个答案是一个不错的干净方法。只是添加一些注释,这也适用于 Autofac 自动提供的 IIndex&lt;K,V&gt; 关系类型,例如:

    public class ValidatorFactory : ValidatorFactoryBase {
        readonly IIndex<Type, IValidator> _validators;
    
        public ValidatorFactory(IIndex<Type, IValidator> validators) {
            _validators = validators;
        }
    
        public override IValidator CreateInstance(Type validatorType) {
            return _validators[validatorType];
        }
    }
    

    重要提示:不要在组件中使用IContainerProviderApplicationContainer,而是使用IComponentContextIIndex&lt;K,V&gt;,如上所述。这将有助于防止生命周期问题(您的示例将验证器与应用程序关联,而不是请求生命周期。)

    【讨论】:

      【解决方案3】:

      当前注册码:

      builder.RegisterType<EmployeeViewModelValidator>().Keyed<IValidator>(typeof(EmployeeViewModel));
      builder.RegisterType<ValidatorFactory>().As<IValidatorFactory>();
      
      _containerProvider = new ContainerProvider(builder.Build());
      

      当前验证器工厂:

      public class ValidatorFactory : ValidatorFactoryBase {
          readonly IIndex<Type, IValidator> _validators; 
      
          public ValidatorFactory(IIndex<Type, IValidator> validators) {
              _validators = validators;
          } 
      
          public override IValidator CreateInstance(Type validatorType) {
              return _validators[validatorType];
          }
      }
      

      CreateInstance 内部出现同样的错误:

      请求的服务 'FluentValidation.IValidator`1[.EmployeeViewModel] (FluentValidation.IValidator)' 尚未注册。

      【讨论】:

      • 在您的注册中,我认为应该是typeof(EmployeeViewModelValidator),因为那将是传递给CreateInstance的类型
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      相关资源
      最近更新 更多