2012-09-01 30 views
6

Necesito poder proporcionar el IComponentContext en mi ValidatorFactory para resolver los Validators de FluentValidation. Estoy un poco atrapado.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; 
     } 
    } 

¿Cómo puedo proporcionar el contexto y registrar el ValidatorFactory

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

Respuesta

0

Me di cuenta de esto. Si tiene el ValidatorFactory tome IComponentContext, Autofac lo inyecta automáticamente.

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

Registrar el ValidatorFactory

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

Debe proporcionar el código correcto en su respuesta, y luego también márquelo como la respuesta. –

+0

@ErikFunkenbusch El código es correcto. He aceptado mi respuesta. – Sam

9

En lugar de bien acoplarla a Autofac, puede hacer que sea aplicable en general a cualquier DependencyResolver mediante el uso que directa:

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

Luego puede registrar sus validadores con cualquier tipo de DependencyResolver como el IValidator<T> fuertemente tipado y siempre terminará resolviendo.

+0

¡Agradable! Me gusta ... Marqué el tuyo como la respuesta en lugar de la mía solo por el hecho de que ahora es genérico. Gracias – Sam

Cuestiones relacionadas