如何指定应在哪个构造函数参数

时间:2017-08-10 07:38:28

标签: c# dependency-injection ninject

让我们说我们正在构建一个工作站并使用一些简单的类:

// two instances of this class are provided
Class Cable {

}

// this class requires one cable - each requires each 
// BUT we know that they are provided before instancing Desktop
Class Screen {
  Screen(Cable cable)
  {
  }
}

// this class requires two screens, which require each one cable
Class Desktop {
  Desktop(Screen left, Screen right)
  {
  }
}

我们正在使用NInject将这个对象树实例化为对其他东西的依赖。问题是 - 我们已经有两个Cable实例,每个实例用于每个屏幕。他们来自两个不同的套接字,那么如何配置呢?

// we get the cables from elsewhere
Cable leftCable = ...
Cable rightCable = ...

// so we add them as constants to kernel
kernel.Bind<Cable>().ToConstant(leftCable);
kernel.Bind<Cable>().ToConstant(rightCable);

kernel.Bind<Desktop>().ToSelf();

kernel.Get<Desktop>();

但它不起作用 - 有重复的绑定。

好吧,我们可以修改原始构造函数并使用NamedAttribute,如下所示:

Class Desktop {
  Desktop([Named("LeftScreen")] Screen left, [Named("RightScreen")] Screen right) { }
}

我们的内核会像这样设置:

kernel.Bind<Cable>().ToConstant(leftCable).WhenParentNamed("LeftScreen");
kernel.Bind<Cable>().ToConstant(rightCable).WhenParentNamed("RightScreen");

不是 - 我以错误的方式使用它。我有Message: Ninject.ActivationException : Error activating Screen No matching bindings are available, and the type is not self-bindable. :(

好的,我可以创建绑定方法。但是在这种情况下,需要更多的代码和类型才能失败使用NInject的目的。这是现实生活中的简化示例。

另外,我可以使用属性注入,但它有严重的缺点。

0 个答案:

没有答案