将多个实现与Ninject绑定到相同的接口



为什么我不可能在ninect中进行以下操作?

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

这四个实现中的每个实现都具有不同的构造函数,该构造函数期望不同类型。当我尝试此操作时,ninject抛出了一个例外,告诉我我不能多次绑定到同一界面。

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

ninject识别不同的构造函数参数类型的方法是什么?

与多个接口的绑定很好。ninject允许这样做。请参阅此处:https://github.com/ninject/ninject/wiki/multi-injection

问题在于,ninject不仅可以神奇地给您您想要的"一个",这取决于构造函数。当您索要列表时,NInight旨在用您编写的代码进行操作是一次给您所有绑定。

就像其他人所说的那样,如果您只想要一个实例,那么听起来您想要的是上下文绑定。但是,您提出问题和其他答案的方式有些混乱,因为这听起来像是多注射,但是如果您确实想要的话,这是可能的。(在这种情况下不是)

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

有条件结合:https://github.com/ninject/ninject/wiki/contextual-binding

我建议使用.When(...)语法,但也许您喜欢使用.Named(...)(即,将名称/标识符分配给每个绑定和将该名称传递给.Get<IPresenter>("SomeName")呼叫中的ninject)。

您需要使用上下文绑定。我通常使用具体的"目标"类来决定内核将通过使用.WhenInjectedInto().WhenInjectecExactlyInto()

最新更新