2017-02-20 2 views
1

Im MVC-Projekt im genannten Arbeits ich fliessend Validation verwenden, um einige Validierungslogik zu implementieren und ich definierte meine UnityValidatorFactory, wie folgend:Fluent Validierung und IOC-Container: CreateInstance oft in MVC Web-Anwendung

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

In global. asax i registriere meine Klasse wie folgt:

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

definierte ich meinen Validator für mein Viewmodel:

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

ich meine Validator in der Einheit registrieren:

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

Wenn ich Daten an die Aktion schreiben mit dem Argument vom Typ ServiceRequestViewModel die Methode CreateInstance so oft genannt wird, und die Konstruktor ServiceRequestViewModelValidator auch. Da die von mir implementierten Validierungsregeln zeitaufwendig sind, werden sie nicht mehr als einmal ausgeführt. Außerdem verstehe ich nicht, warum sie mehr als einmal angerufen werden.

Antwort

0

Später fand ich heraus, dass MVC so funktioniert. In MVC gibt es viele Stellen, an denen MVC den Validator benötigt, zum Beispiel versucht es, Metadaten für jede Eigenschaft zu erhalten, und ruft für jeden einzelnen den Provider auf. Dann, um mein Problem zu beheben, habe ich meine Validatoren als Singleton-Instanzen erstellt, die den Validator in Einheit mit ContainerControlledLifetimeManager

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