用SimpleInjector注册FluentValidation的正确方法是什么? [英] What is the correct way to register FluentValidation with SimpleInjector?

本文介绍了用SimpleInjector注册FluentValidation的正确方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我能够使用FluentValidatorFactory注册FluentValidation AbstractValidators.但是,这并不正确,因为并非所有IoC容器注册都发生在引导程序/合成根期间.相反,流利的验证器由单独的工厂注册:

I am able to register FluentValidation AbstractValidators using a FluentValidatorFactory. However, it doesn't feel right, because not all of the IoC container registrations happen during bootstrap / composition root. Instead, the fluent validators are registered by a separate factory:

组成根:

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

An abstract fluent validator factory depending only on 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的流利的验证器工厂实现

A fluent validator factory implementation for 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对开放泛型有很好的支持,并且我所有流利的验证器类都具有类似于以下内容的签名:

SimpleInjector has good support for open generics, and all of my fluent validator classes have signatures similar to the following:

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

因此,有没有比使用fluent的验证器工厂更好的方法来在引导程序/组合根中注册验证器?

So, is there a better way to register the validators in the bootstrap / composition root, instead of using fluent's validator factory?

P.S. @DotNetJunkie -如果您在simpleinjector.codeplex.com 上有有关此Wiki的页面,那就太好了.

P.S. @DotNetJunkie -- would be great if you had a wiki page on this at simpleinjector.codeplex.com.

推荐答案

我想我自己想出来的.

1.)在组合根目录中注册fluent的开放通用IValidator<T>接口:

1.) Register fluent's open generic IValidator<T> interface in the composition root:

public class SimpleDependencyInjector : IServiceProvider
{
    public readonly Container Container;

    public SimpleDependencyInjector()
    {
        Container = Bootstrap();
    }

    internal Container Bootstrap()
    {
        var container = new Container();

        // some container registrations

        var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
        container.RegisterManyForOpenGeneric(typeof(IValidator<>), assemblies);

        // some more registrations

        container.Verify();
        return container;
    }

    public object GetService(Type serviceType)
    {
        return ((IServiceProvider)Container).GetService(serviceType);
    }
}

2.)摆脱SimpleValidatorFactory类.

3.)将FluentValidatorFactory设为非抽象的具体类:

3.) Make the FluentValidatorFactory a non-abstract, concrete class:

public class FluentValidatorFactory : ValidatorFactoryBase
{
    private IServiceProvider Injector { get; set; }

    public FluentValidatorFactory(IServiceProvider injector)
    {
        Injector = injector;
    }

    public override IValidator CreateInstance(Type validatorType)
    {
        return Injector.GetService(validatorType) as IValidator;
    }
}

4.)在global.asax中将FluentValidatorFactory注册为验证工厂提供程序:

4.) Register the FluentValidatorFactory as the validation factory provider in global.asax:

var injector = new SimpleDependencyInjector();
FluentValidationModelValidatorProvider.Configure(
    provider =>
    {
        provider.ValidatorFactory = new FluentValidatorFactory(injector);
    }
);

这篇关于用SimpleInjector注册FluentValidation的正确方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆