我可以注册 FluentValidationAbstractValidators
用一个FluentValidatorFactory
。然而,它并没有feel是的,因为并非所有 IoC 容器注册都发生在引导/组合根期间。相反,:
The 成分根:
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);
}
}
An 抽象流利验证器工厂仅取决于 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;
}
}
A 流畅的验证器工厂实现对于简单注入器
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 的验证器工厂呢?
附: @DotNetJunkie——如果你有的话那就太好了有关此内容的 wiki 页面位于 simpleinjector.codeplex.com http://fluentvalidation.codeplex.com/documentation.