可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I need to be able to provide the IComponentContext
to my ValidatorFactory
to resolve FluentValidation Validators. I am a little stuck.
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; } }
How do I provide the context and register the ValidatorFactory
FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new ValidatorFactory());
回答1:
Rather than tightly couple it to Autofac, you can make it generally applicable to any DependencyResolver
by using that directly:
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>>(); } }
Then you can register your validators with any type of DependencyResolver
as the strongly-typed IValidator<T>
and it will always end up resolving.
回答2:
I figured this out. If you have the ValidatorFactory
take IComponentContext
, Autofac injects it automatically.
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; } }
Register the ValidatorFactory
FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new ValidatorFactory());