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

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

在我工作的 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 中,我这样注册 class:

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

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

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

我在 unity 中注册了我的验证器:

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

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

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

统一注册验证器
container.RegisterType<IValidator<ServiceRequestViewModel>, ServiceRequestViewModelValidator>(new ContainerControlledLifetimeManager());