在Ninject中注入相同类型的多个参数

时间:2015-01-28 22:31:45

标签: c# dependency-injection ninject ioc-container

假设我们有这样的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的两个实例也有不同的字符串。

由于

3 个答案:

答案 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");
}