让我们说我们正在构建一个工作站并使用一些简单的类:
// 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的目的。这是现实生活中的简化示例。
另外,我可以使用属性注入,但它有严重的缺点。