Как правильно зарегистрировать FluentValidation в SimpleInjector?

Я могу зарегистрировать FluentValidation AbstractValidatorsс помощью FluentValidatorFactory. Однако это кажется неправильным, потому что не все регистрации контейнеров IoC происходят во время начальной загрузки/композиции root. Вместо этого текучие валидаторы регистрируются отдельной фабрикой:

корень композиции:

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 имеет хорошую поддержку открытых дженериков, и все мои классы Fluent валидаторов имеют сигнатуры, подобные следующим:

public class SomeClassValidator : AbstractValidator
{
    public SomeClassValidator([depedencies injected here])
    {
        //... set up validation rules
    }
}

Итак, есть ли лучший способ зарегистрировать валидаторы в начальной загрузке/композиции root вместо использования фабрики валидаторов Fluent?

П.С. @DotNetJunkie --было бы здорово, если бы у вас была вики-страница по этому вопросу на simpleinjector.codeplex.com .

7
задан Steven 3 April 2012 в 05:06
поделиться