用SimpleInjector注册FluentValidation的正确方法是什么? [英] What is the correct way to register FluentValidation with SimpleInjector?
问题描述
我能够使用FluentValidatorFactory
注册FluentValidation AbstractValidators
.但是,这并不正确,因为并非所有IoC容器注册都发生在引导程序/合成根期间.相反,流利的验证器由单独的工厂注册:
I am able to register FluentValidation AbstractValidators
using a FluentValidatorFactory
. However, it doesn't feel right, because not all of the IoC container registrations happen during bootstrap / composition root. Instead, the fluent validators are registered by a separate factory:
组成根:
public class SimpleDependencyInjector : IServiceProvider
{
public readonly Container Container;
public SimpleDependencyInjector()
{
Container = Bootstrap();
}
internal Container Bootstrap()
{
var container = new Container();
container.Register< // ...register all non-fluent-validator types, then
container.Verify();
return container;
}
public object GetService(Type serviceType)
{
return ((IServiceProvider)Container).GetService(serviceType);
}
}
抽象的流利验证器工厂,仅取决于IServiceProvider
An abstract fluent validator factory depending only on IServiceProvider
public abstract class FluentValidatorFactory : ValidatorFactoryBase
{
private IServiceProvider Injector { get; set; }
protected FluentValidatorFactory(IServiceProvider injector)
{
Injector = injector;
}
public override IValidator CreateInstance(Type validatorType)
{
return Injector.GetService(validatorType) as IValidator;
}
}
用于SimpleInjector的流利的验证器工厂实现
A fluent validator factory implementation for SimpleInjector
public class SimpleValidatorFactory : FluentValidatorFactory
{
public SimpleValidatorFactory(SimpleDependencyInjector injector)
: base(injector)
{
var validators = AssemblyScanner.FindValidatorsInAssembly(
Assembly.GetCallingAssembly());
validators.ForEach(validator =>
injector.Container.Register(
validator.InterfaceType, validator.ValidatorType));
injector.Container.Verify();
}
}
SimpleInjector对开放泛型有很好的支持,并且我所有流利的验证器类都具有类似于以下内容的签名:
SimpleInjector has good support for open generics, and all of my fluent validator classes have signatures similar to the following:
public class SomeClassValidator : AbstractValidator<SomeClass>
{
public SomeClassValidator([depedencies injected here])
{
// ... set up validation rules
}
}
因此,有没有比使用fluent的验证器工厂更好的方法来在引导程序/组合根中注册验证器?
So, is there a better way to register the validators in the bootstrap / composition root, instead of using fluent's validator factory?
P.S. @DotNetJunkie -如果您在simpleinjector.codeplex.com 上有有关此Wiki的页面,那就太好了.
P.S. @DotNetJunkie -- would be great if you had a wiki page on this at simpleinjector.codeplex.com.
推荐答案
我想我自己想出来的.
1.)在组合根目录中注册fluent的开放通用IValidator<T>
接口:
1.) Register fluent's open generic IValidator<T>
interface in the composition root:
public class SimpleDependencyInjector : IServiceProvider
{
public readonly Container Container;
public SimpleDependencyInjector()
{
Container = Bootstrap();
}
internal Container Bootstrap()
{
var container = new Container();
// some container registrations
var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
container.RegisterManyForOpenGeneric(typeof(IValidator<>), assemblies);
// some more registrations
container.Verify();
return container;
}
public object GetService(Type serviceType)
{
return ((IServiceProvider)Container).GetService(serviceType);
}
}
2.)摆脱SimpleValidatorFactory
类.
3.)将FluentValidatorFactory
设为非抽象的具体类:
3.) Make the FluentValidatorFactory
a non-abstract, concrete class:
public class FluentValidatorFactory : ValidatorFactoryBase
{
private IServiceProvider Injector { get; set; }
public FluentValidatorFactory(IServiceProvider injector)
{
Injector = injector;
}
public override IValidator CreateInstance(Type validatorType)
{
return Injector.GetService(validatorType) as IValidator;
}
}
4.)在global.asax中将FluentValidatorFactory注册为验证工厂提供程序:
4.) Register the FluentValidatorFactory as the validation factory provider in global.asax:
var injector = new SimpleDependencyInjector();
FluentValidationModelValidatorProvider.Configure(
provider =>
{
provider.ValidatorFactory = new FluentValidatorFactory(injector);
}
);
这篇关于用SimpleInjector注册FluentValidation的正确方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!