使用Ninject 2.0注入相同类型的多个构造函数参数

Eig*_*ite 11 dependency-injection inversion-of-control ninject-2

我正在使用Ninject 2.0在我的一个应用程序中处理DI,而且我遇到了令我困惑的事情.说实话,零文档并没有太大帮助.

假设我有一个带签名的构造函数 -

ctor(IServiceFactory factory1, IServiceFactory factory2)
{
    this.factory1 = factory1;
    this.factory2 = factory2;
}
Run Code Online (Sandbox Code Playgroud)

虽然这两个服务实现了相同的接口,但它们是完全不同的实现,并且在不同的时间使用,因此我不想注入IEnumerable<IServiceFactory>.

我的问题是,当我绑定实例时,如何告诉Ninject每个注入的内容?

提前致谢.

更新

为了让任何想要看到代码的人在阅读雷莫的链接后结束,...这里简单介绍一下.(我从未意识到C#有参数属性!)

//abstract factory
public interface IServiceFactory
{
    Service Create();
}

//concrete factories
public class Service1Factory : IServiceFactory
{
    public IService Create()
    {
        return new Service1();
    }
}

public class Service2Factory : IServiceFactory
{
    public IService Create()
    {
        return new Service2();
    }
}

//Binding Module (in composition root)
public class ServiceFactoryModule : NinjectModule
{
    public override void Load()
    {
        Bind<IServiceFactory>()
            .To<Service1Factory>()
            .Named("Service1");

        Bind<IServiceFactory>()
            .To<Service2Factory>()
            .Named("Service2");
    }
}

//consumer of bindings
public class Consumer(
    [Named("Service1")] service1Factory,
    [Named("Service2")] service2Factory)
{
}
Run Code Online (Sandbox Code Playgroud)

Rem*_*oor 10

首先,如果实现需要做一个完全不同的事情,你必须问自己,使用相同的接口是否正确.通常,接口是消费者和实现之间的契约.因此,如果消费者期望不同的东西,那么您可能会考虑定义不同的接口.

如果您决定使用相同的界面而不是必须使用条件绑定.请参阅有关如何完成此操作的文档:

https://github.com/ninject/ninject/wiki/Contextual-Binding

https://github.com/ninject/ninject/wiki/Conventions-Based-Binding