【问题标题】:Fluent Validation and Ioc container: CreateInstance called many times in MVC web applicationFluent Validation 和 Ioc 容器:在 MVC Web 应用程序中多次调用 CreateInstance
【发布时间】:2017-02-20 08:24:59
【问题描述】:

在我正在工作的 MVC 项目中,我使用 Fluent Validation 来实现一些验证逻辑,我将UnityValidatorFactory 定义如下:

public class UnityValidatorFactory : ValidatorFactoryBase
{
    private readonly IUnityContainer _container;

    public UnityValidatorFactory(IUnityContainer container)
    {
        _container = container;
    }

    public override IValidator CreateInstance(Type validatorType)
    {
        if (_container.IsRegistered(validatorType))
        {
            return _container.Resolve(validatorType) as IValidator;
        }
        return null;
    }
}

在 global.asax 中,我像这样注册我的课程:

var validationFactory = new UnityValidatorFactory(container); 
var fluentValidationModelValidatorProvider = new FluentValidationModelValidatorProvider(validationFactory); 

我为我的视图模型定义了我的验证器:

public class ServiceRequestViewModelValidator : AbstractValidator<ServiceRequestViewModel>
{
    public ServiceRequestViewModelValidator()
    {
        // many validation rules here...
    }   
}

我统一注册我的验证器:

container.RegisterType<IValidator<ServiceRequestViewModel>, ServiceRequestViewModelValidator>();

当我使用 ServiceRequestViewModel 类型的参数将数据发布到操作时,CreateInstance 方法被调用了很多次,并且 ServiceRequestViewModelValidator 的构造函数也是如此。 因为我实施的验证规则非常耗时,所以我不会将它们执行一次以上。此外,我不明白为什么他们不止一次被调用。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 fluentvalidation


    【解决方案1】:

    我后来发现这就是 MVC 的工作原理。在 MVC 中有很多地方 MVC 需要获取验证器,例如它尝试获取每个属性的元数据,并为每个属性调用提供程序。 然后为了解决我的问题,我将验证器创建为单例实例,并使用 ContainerControlledLifetimeManager 统一注册验证器

    container.RegisterType<IValidator<ServiceRequestViewModel>, ServiceRequestViewModelValidator>(new ContainerControlledLifetimeManager());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多