簡體   English   中英

在Ninject中注入相同類型的多個參數

[英]Injection of multiple parameters of the same type in Ninject

可以說我們有一個這樣的X類:

class X
{
   X(Z a, Z b)
   { }
}

Z類將具有Y依賴項:

class Z
{
   Z(Y c)
   { }
}

綁定這些類的正確方法是什么,以便將兩個Z實例(每個都有一個不同的Y實例)注入X?

我知道這些與上下文綁定有關,但是我不確定該怎么做。

編輯:

Y類為:

class Y
{
    Y(string someString)
    { }
}

我也希望Y的兩個實例具有不同的字符串。

謝謝

您可以使用命名綁定 其他類型的上下文綁定可以在這里找到。

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) {}
}

如果您對X和Y的綁定沒有作用域,那么每次從內核請求一個X對象時,它將使用兩個唯一的Z對象(每個對象都有一個唯一的Y實例)構造。 默認情況下會發生這種情況。

傳遞實現與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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM