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

时间:2011-11-02 15:26:04

标签: dependency-injection inversion-of-control ninject-2

我正在使用Ninject 2.0在我的某个应用程序中处理DI,而且我遇到了令我困惑的事情。说实话,没有文件也没有太多帮助。

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

ctor(IServiceFactory factory1, IServiceFactory factory2)
{
    this.factory1 = factory1;
    this.factory2 = factory2;
}

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

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

提前致谢。

更新

为了想要看到代码在读完Remo的链接后结束的人,...这里简单介绍一下。 (我从未意识到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)
{
}

1 个答案:

答案 0 :(得分:10)

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

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

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

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