假设我们有这样的X类:
class X
{
X(Z a, Z b)
{ }
}
Z类具有Y依赖性:
class Z
{
Z(Y c)
{ }
}
绑定这些类的正确方法是什么,这样两个Z实例(每个实例都有一个不同的Y实例)被注入X?
我知道这些与Context Binding有关,但我不知道如何去做。
编辑:
Y班级将是:
class Y
{
Y(string someString)
{ }
}
我希望Y的两个实例也有不同的字符串。
由于
答案 0 :(得分:0)
您可以使用 Named Bindings 。可以找到其他类型的上下文绑定here。
Bind<X>().To<XA>().Named("A");
Bind<X>().To<XB>().Named("B");
public class Z {
public Z([Named("A")] X x1, [Named("B")] X x2) {}
}
答案 1 :(得分:0)
如果X和Y的绑定没有作用域,则每次从内核请求X对象时,它将构造有两个唯一的Z对象(每个对象具有唯一的Y实例)。这将默认发生。
答案 2 :(得分:0)
传递实现与IEnumerable相同接口的依赖项。否则,如果你有一个接口的多个绑定,Ninject会对你大喊大叫。使用.WithConstructorArgument()方法定义字符串。如果字符串不是常量,则可以使用.ToMethod()代替并在运行时确定字符串。
public class Z
{
public Z(IEnumerable<Y> dependencies)
{
if (dependencies == null) throw new ArgumentNullException("dependencies");
_dependencies = dependencies;
}
}
static void Main() // or other entry point
{
var kernel = new StandardKernel();
kernel.Bind<Z>().To<ZImplementation>();
kernel.Bind<Y>().To<YImplementation1>().WithConstructorArgument("c", "string to inject 1");
kernel.Bind<Y>().To<YImplementation2>().WithConstructorArgument("c", "string to inject 2");
}