繁体   English   中英

Fluent Validation和Ioc容器:在MVC Web应用程序中多次调用CreateInstance

[英]Fluent Validation and Ioc container: CreateInstance called many times in MVC web application

在我工作的MVC项目中,我使用Fluent验证来实现一些验证逻辑,我将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); 

我为我的viewmodel定义了我的验证器:

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

我统一注册我的验证器:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM