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

biz*_*dee 20 c# ninject

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

Kernel.Bind<IPresenter>.To<DefaultPresenter>();
Kernel.Bind<IPresenter>.To<DashboardPresenter>();
Kernel.Bind<IPresenter>.To<HeartRatePresenter>();
Kernel.Bind<IPresenter>.To<GPSPresenter>();
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rob*_*ack 23

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

问题是Ninject不能只是根据构造函数参数神奇地给你你想要的"一个".Ninject旨在处理您编写的代码是为了在您请求List时立即为您提供所有绑定.

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


Bat*_*nit 12

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

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

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


cvb*_*ros 5

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