为什么我不能在Ninect中执行以下操作?
Kernel.Bind<IPresenter>.To<DefaultPresenter>();
Kernel.Bind<IPresenter>.To<DashboardPresenter>();
Kernel.Bind<IPresenter>.To<HeartRatePresenter>();
Kernel.Bind<IPresenter>.To<GPSPresenter>();
4个实现中的每一个都有不同的构造函数,期望不同的类型 . 当我尝试这个时,Ninject会抛出一个异常,告诉我我不能多次绑定到同一个界面 .
在所有presenter类继承的 Presentable
类中,我试图执行 Kernel.Get<IPresenter>(new ConstructorArgument("view", this))
,因此在页面/视图中分配 IPresentable Presenter
,其中页面/视图实现了演示者期望作为参数的接口 .
有什么方法可以让ninject识别不同的构造函数参数类型?
3 回答
绑定到多个接口很好 . Ninject允许这样做 . 看到这里:https://github.com/ninject/Ninject/wiki/Multi-injection
问题是Ninject不能只是根据构造函数参数神奇地给你你想要的“一个” . Ninject旨在处理您编写的代码是为了在您请求List时立即为您提供所有绑定 .
所以像其他人说的那样,如果你只想要一个实例,那么听起来你想要的是上下文绑定 . 然而,你问你的问题和其他答案的方式有点混乱,因为它听起来像多次注射是不可能的,但它是可能的,如果它真的是你想要的 . (在这种情况下不是)
你需要告诉ninject它应该知道选择哪个绑定 .
看看条件绑定:https://github.com/ninject/ninject/wiki/Contextual-Binding
我建议使用
.When(...)
语法,但您可能更喜欢使用.Named(...)
(i.E.为每个绑定分配名称/标识符,并在.Get<IPresenter>("SomeName")
调用中将该名称传递给ninject) .您需要使用上下文绑定 . 我通常使用具体的"target"类来决定内核将使用
.WhenInjectedInto()
或.WhenInjectecExactlyInto()
提供哪种服务实现 .