我能够使用
一个适用于SimpleInjector的流畅验证工厂实现。
SimpleInjector对开放式泛型有很好的支持,我的所有流畅验证器类的签名都类似于以下内容:
FluentValidatorFactory
注册AbstractValidators
的程序集。然而,这种方式并不对,因为并非所有IoC容器都是在引导/组合根期间进行注册。取而代之的是,Fluent validators由一个单独的工厂进行注册:
组合根: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的抽象流畅验证器工厂
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的流畅验证工厂实现。
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对开放式泛型有很好的支持,我的所有流畅验证器类的签名都类似于以下内容:
public class SomeClassValidator : AbstractValidator<SomeClass>
{
public SomeClassValidator([depedencies injected here])
{
// ... set up validation rules
}
}
那么,在引导程序/组合根中注册验证器是否有更好的方法,而不是使用Fluent的验证器工厂?
P.S. @DotNetJunkie -- 如果您在simpleinjector.codeplex.com上有关于此的维基页面,那就太棒了。
SimpleDependencyInjector
类是用于实现IServiceProvider
的simpleinjector特定实现。我不想引用SI容器,就像在切换到SI之前没有引用IUnityContainer
代码一样。 - danludwig