Как я могу автоматически зарегистрировать все мои свободные валидаторы в Unity?

Прямо сейчас я подключил мои валидаторы и встроил их в мое приложение, но каждый раз, когда мы добавляем новый валидатор, нам нужно вручную заходить в нашу конфигурацию Unity и регистрировать тип. Я хотел бы сделать это автоматически, так же, как в этом блоге описывается работа со StructureMap, только для Unity.

Прямо сейчас у меня есть что-то вроде этого:

    // in global.asax.cs
    protected void Application_Start(Object sender, EventArgs e)
    {
        // some irrelevant registrations (area registrations, route config, etc)

        var container = new UnityContainer();
        UnityConfig.RegisterComponents(container);
        FluentValidationModelValidatorProvider.Configure(c => c.ValidatorFactory = new UnityValidatorFactory(container));
    }

public class UnityValidatorFactory : ValidatorFactoryBase
{
    private readonly IUnityContainer container;

    public UnityValidatorFactory(IUnityContainer container)
    {
        this.container = container;
    }

    public override IValidator CreateInstance(Type validatorType)
    {
        if (container.IsRegistered(validatorType))
        {
            return container.Resolve(validatorType) as IValidator;
        }

        return null;
    }
}

public static class UnityConfig
{
    public static void RegisterComponents(IUnityContainer container)
    {
        container.RegisterTypes(
            AllClasses.FromAssemblies(
                Assembly.GetAssembly(typeof (UnityConfig)),
            WithMappings.FromMatchingInterface, WithName.Default);

        RegisterValidators(container);

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }

    private static void RegisterValidators(IUnityContainer container)
    {
        container.RegisterType<IValidator<MyFirstViewModel>, MyFirstViewModelValidator>();           
        container.RegisterType<IValidator<MySecondViewModel>, MySecondViewModelValidator>();                                   
    }
 }

То, что у меня есть, работает, но я должен продолжать добавлять регистрации в RegisterValidators() каждый раз, когда создается новый валидатор. Есть ли способ, которым я могу настроить это для автоматического обнаружения и регистрации всех валидаторов?

2 ответа

Решение

Это оказалось довольно легко, когда я понял, что делаю, что, возможно, объясняет, почему поиск в Google не дал результатов. Я переписал RegisterValidators следующим образом:

private static void RegisterValidators(IUnityContainer container)
{
        var validators = AssemblyScanner.FindValidatorsInAssemblyContaining<OneOfMyValidators>();
        validators.ForEach(validator => container.RegisterType(validator.InterfaceType, validator.ValidatorType));
}

Вы можете позволить настройке FV сделать работу за вас, пожалуйста, обратитесь к 1-му комментарию здесь для получения более подробной информации от участников

public IServiceProvider ConfigureServices( IServiceCollection services )
        {
            services.AddAuthorization(options =>...);
            services.AddMvc()
                    .AddFluentValidation( o =>
                    {
                        o.RegisterValidatorsFromAssemblyContaining<Startup>();
                    } );
Другие вопросы по тегам