如何使用Unity自动注册所有流畅的验证器?

Ste*_*rno 5 asp.net-mvc unity-container fluentvalidation

现在我已经将我的验证器连接起来并在我的应用程序中构建,但每次我们添加一个新的验证器时,我们需要手动进入我们的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>();                                   
    }
 }
Run Code Online (Sandbox Code Playgroud)

我所拥有的是工作,但每次创建新的验证器时,我都必须继续向RegisterValidators()添加注册.有没有办法我可以设置它来自动检测和注册所有验证器?

Ste*_*rno 8

一旦我弄清楚我在做什么,这就变得很容易了,这也许可以解释为什么谷歌搜索答案没有产生任何结果.我重写了RegisterValidators如下:

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