2017-02-20 57 views
1

多次在MVC项目IM工作,我用流利的验证来实现一些验证逻辑,我定义我的UnityValidatorFactory如下:流利的验证和IOC容器:的CreateInstance称为MVC Web应用程序

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

在全球性的。 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,以及数据发布同类型的变量的操作。 因为我实施的验证规则非常耗时,所以我不会让他们多执行一次。此外,我不明白他们为什么要打一次以上。

回答

0

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

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