2012-04-04 7 views
1

Ich verwende FluentValidation und Ninject. Ich versuche, einen Dienst in AbstractValidatorFluentValidation + Ninject: Wie man AbstractValidator für die Abhängigkeitsinjektion einrichtet

[Validator(typeof(CompetitionFormModelValidator))] 
public class CompetitionFormModel 
{ 

    public string FirstName { get; set; }  

} 

und für meine Validierung zu injizieren:

public class CompetitionFormModelValidator : AbstractValidator<CompetitionFormModel> 
{ 

    IUserService UserService; 

    public CompetitionFormModelValidator(IUserService UserService) 
    { 

     this.UserService= UserService; 

     RuleFor(c => c.FirstName).NotEmpty().WithMessage(" ").Length(1, 100); 

     Custom(c => 
     { 
      //.. try uusing UserService here 


      return null; 
     });  



    } 
} 

In meinem global.asax.cs

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     var ninjectValidatorFactory = new NinjectValidatorFactory(new StandardKernel()); 
     ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(ninjectValidatorFactory)); 
     DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 
     FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = ninjectValidatorFactory);    

    } 

In NinjectWebCommon.cs

private static void RegisterServices(IKernel kernel) 
    { 
     AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly()) 
.ForEach(match => kernel.Bind(match.InterfaceType) 
    .To(match.ValidatorType)); 

     kernel.Bind<IUserService>().To<UserService>(); 

    } 

Das Projekt compi les gut. Als ich nicht versuchte, DI zu verwenden, funktionierte Validierung auch gut. Jetzt, da ich versuche, IUserService zu injizieren, wird die Validierung nicht aufgerufen.

Habe ich die Konfiguration von ninject.web.mvc.fluentvalidation richtig eingerichtet? Jede Hilfe würde sehr geschätzt werden.

Antwort

1

In Ihrem Application_Start Sie neu auf die NinjectValidatorFactory mit einer neuen StandardKernel statt mit Ihrem vorhandenen Kernel - so die Validierer Sie auf Ihrem vorhandenen Kernel registriert wird nicht von den NinjectValidatorFactory finden.

Wenn Sie diesen Codeblock an einen Ort verschieben, an dem Sie Zugriff auf den vorhandenen Kernel haben und diesen übergeben, sollte das Problem behoben sein.

Verwandte Themen