我有以下类(class):
using System;
interface IA { }
class A1 : IA { }
class A2 : IA { }
class B
{
public B(IA a) {}
}
class BProvider : Provider<B>
{
IA _a;
public BProvider(IA a) { _a=a; }
protected override B CreateInstance(IContext context) { return new B(_a); }
}
ninject 模块 Load() 代码:
Bind<IA>().To<A1>();
Bind<IA>().To<A2>();
Bind<B>().ToProvider<BProvider>();
主要代码:
kernel.GetAll<IA>(); // works fine
kernel.GetAll<B>(); // I expect to get IEnumerable<B> with two elements, but instead of this I get an error that there are multiple bindings of IA and ninject cannot determine which to use
所以问题是我是否可以使最后一条语句按预期工作或以其他方式进行?
最佳答案
它将抛出该异常,因为 Ninject 需要创建类型为 BProvider
的对象实例。为此,它必须填写对 IA
的依赖。但是瞬间... IA
上有两个绑定(bind),我应该选择哪个?....
您可以使用一些条件绑定(bind)来决定应该使用哪个实现。
一种方法是使用 NamedAttribute
:
Bind<IA>().To<A1>();
Bind<IA>().To<A2>().Named("SecondImpl");
Bind<B>().ToProvider<BProvider>();
class BProvider : Provider<B>
{
IA _a;
public BProvider([Named("SecondImpl")]IA a) { _a=a; }
protected override B CreateInstance(IContext context) { return new B(_a); }
}
在这种情况下,A1 将作为未指定 NamedAttribute
的默认值注入(inject)。
或者像@Remo Gloor 在这篇文章中解释的那样:Configuring Ninject
Bind<IA>().To<A1>();
Bind<IA>().To<A2>().WhenParentNamed("NeedSecondImpl");
Bind<B>().ToProvider<BProvider>().Named("NeedSecondImpl");
这更简洁一些,因为您不必将您的代码绑定(bind)到 Ninject,只需让它在配置上(在一个地方)。
关于c# - Ninject 注入(inject)接口(interface)的多重绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11676983/