首页 文章

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

提问于
浏览
15

为什么我不能在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 回答

  • 5

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

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

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

  • 8

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

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

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

  • 18

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

相关问题