2012-09-01 6 views
6

Devo essere in grado di fornire il IComponentContext al mio ValidatorFactory per risolvere i validatori di convalida FluentValidation. Sono un po 'bloccato.FluentValidation Autofac ValidatorFactory

ValidatorFactory

public class ValidatorFactory : ValidatorFactoryBase 
    { 
     private readonly IComponentContext context; 

     public ValidatorFactory(IComponentContext context) 
     { 
      this.context = context; 
     } 

     public override IValidator CreateInstance(Type validatorType) 
     { 
      return context.Resolve(validatorType) as IValidator; 
     } 
    } 

Come faccio a fornire il contesto e il registro ValidatorFactory

FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new ValidatorFactory()); 

risposta

0

ho capito questo. Se si dispone di ValidatorFactory prendere IComponentContext, Autofac lo inserisce automaticamente.

ValidatorFactory

public class ValidatorFactory : ValidatorFactoryBase 
    { 
     private readonly IComponentContext context; 

     public ValidatorFactory(IComponentContext context) 
     { 
      this.context = context; 
     } 

     public override IValidator CreateInstance(Type validatorType) 
     { 
      return context.Resolve(validatorType) as IValidator; 
     } 
    } 

Registrare il ValidatorFactory

FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new ValidatorFactory()); 
+3

È necessario fornire il codice corretto nella risposta, quindi contrassegnarlo come risposta. –

+0

@ErikFunkenbusch Il codice è corretto. Ho accettato la mia risposta. – Sam

9

Piuttosto che strettamente accoppiarlo a Autofac, si può fare in generale applicabile a qualsiasi DependencyResolver utilizzando tale direttamente:

public class ModelValidatorFactory : IValidatorFactory 
{ 
    public IValidator GetValidator(Type type) 
    { 
    if (type == null) 
    { 
     throw new ArgumentNullException("type"); 
    } 
    return DependencyResolver.Current.GetService(typeof(IValidator<>).MakeGenericType(type)) as IValidator; 
    } 

    public IValidator<T> GetValidator<T>() 
    { 
    return DependencyResolver.Current.GetService<IValidator<T>>(); 
    } 
} 

Quindi puoi registrare i tuoi validatori con qualsiasi tipo di DependencyResolver come lo IValidator<T> fortemente tipizzato e finirà sempre per risolversi.

+0

Bello! Mi piace ... Ho segnato il tuo come risposta invece del mio solo per il fatto che ora è generico! Grazie – Sam