【问题标题】:Injection of multiple parameters of the same type in Ninject在Ninject中注入多个相同类型的参数
【发布时间】:2015-01-28 22:31:45
【问题描述】:

假设我们有一个这样的 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 实例。

谢谢

【问题讨论】:

  • 对不起回答的人,我只是编辑了一下,但例子基本上是一样的。
  • ninject 不以任何特殊方式支持您尝试实现的目标。您可以使用ToMethodIProvider 绑定将创建X 的逻辑与特定的Zs 放在那里。

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


【解决方案1】:

您可以使用 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) {}
}

【讨论】:

  • 你把它颠倒了,但无论如何我的问题是,你如何告诉两个 X 实例同时注入不同的 Y 实例
  • 如果可能的话,最好不要将 Named 属性放在 Z 构造函数中
【解决方案2】:

如果您对 X 和 Y 的绑定没有作用域,那么每次从内核请求一个 X 对象时,它将由两个唯一的 Z 对象(每个都有一个唯一的 Y 实例)构成。这将默认发生。

【讨论】:

  • 是的,你是对的!但是如果我想让两个 Y 实例接收不同的字符串呢?
  • 构造函数参数a(类Z)是否总是接收相同的字符串?构造函数参数 b(Z 类)是否总是接收相同的字符串?
【解决方案3】:

传递实现与 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");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多