Как я могу автоматически зарегистрировать все мои свободные валидаторы в 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>();
} );