2017-02-20 26 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());