2017-02-20 13 views
1

В проекте им MVC работает Я использую Fluent Validation реализовать некоторую логику проверки и я определил мои UnityValidatorFactory следующим образом:Fluent Validation и Ioc контейнер: CreateInstance называется много раз в вебе-приложении MVC

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

Я определил мой валидатор для моего ViewModel:

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

я зарегистрировал свой валидатор в единстве:

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

Когда я отправляю данные действия с аргументом типа ServiceRequestViewModel метода CreateInstance называется так много раз и конструктора ServiceRequestViewModelValidator а. Поскольку правила validatin, которые я реализовал, занимают много времени, я не хочу, чтобы они выполнялись более одного раза. Более того, я не понимаю, почему они звонят более одного раза.

ответ

0

Позже выяснилось, что именно так работает MVC. В MVC есть много мест, где MVC должен получить валидатор, например, он пытается получить метаданные для каждого свойства и вызывает в провайдер для каждого из них. . Затем, чтобы исправить мою проблему, я создал свои валидаторы как экземпляры singleton, регистрирующие валидатор в единстве с ContainerControlledLifetimeManager

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