使用ninject将多个实现绑定到同一个接口

时间:2014-01-22 15:52:26

标签: c# ninject

为什么我不能在Ninect中执行以下操作?

Kernel.Bind<IPresenter>.To<DefaultPresenter>();
Kernel.Bind<IPresenter>.To<DashboardPresenter>();
Kernel.Bind<IPresenter>.To<HeartRatePresenter>();
Kernel.Bind<IPresenter>.To<GPSPresenter>();

4个实现中的每一个都有一个不同的构造函数,期望不同的类型。当我尝试这个时,Ninject会抛出一个异常,告诉我我不能多次绑定到同一个界面。

在所有演示者类继承的名为Presentable的类中,我尝试Kernel.Get<IPresenter>(new ConstructorArgument("view", this)),因此在页面/视图中分配IPresentable Presenter,其中页面/视图实现了一个接口演示者期望作为参数。

有什么方法可以让ninject识别不同的构造函数参数类型?

3 个答案:

答案 0 :(得分:20)

绑定到多个接口很好。 Ninject允许这样做。见这里:https://github.com/ninject/Ninject/wiki/Multi-injection

问题在于,Ninject不能仅仅根据构造函数参数神奇地为您提供所需的“一个”。 Ninject旨在处理您编写的代码是为了在您要求列表时立即为您提供所有绑定。

就像其他人说的那样,如果你只想要一个实例,听起来你想要的是上下文绑定。然而,你问你的问题和其他答案的方式有点混乱,因为它听起来像多次注射是不可能的,但它是可能的,如果它真的是你想要的。 (在这种情况下,它不是)

答案 1 :(得分:8)

你需要告诉ninject它应该知道选择哪种绑定。

看看条件绑定: https://github.com/ninject/ninject/wiki/Contextual-Binding

我建议使用.When(...)语法,但您可能更喜欢使用.Named(...)(iE为每个绑定分配名称/标识符,并在.Get<IPresenter>("SomeName")调用中将该名称传递给ninject)。

答案 2 :(得分:5)

您需要使用上下文绑定。我通常使用具体的“目标”类来决定内核将使用.WhenInjectedInto().WhenInjectecExactlyInto()提供哪种服务实现。