我正在实现构建器设计模式来构造要在 WPF UI 上显示的不同类型的图形对象。我使用 Ninject 作为我的 IOC 容器。然而,我正在尝试找到一个优雅的可扩展解决方案。
我有一个ChartDirector
需要一个对象IChartBuilder
作为依赖。我也有TemperatureChartBuilder
and ThresholdChartBuilder
实施IChartBuilder
。我想注射TemperatureChartBuilder
OR ThresholdChartBuilder
to ChartDirector
取决于触发的事件或取决于客户端调用。我在下面的代码中说明了我的问题。
// ChartDirector also depends on this
kernel.Bind<IExample>().To<Example>();
// when called in Method X...
kernel.Bind<IChartBuilder>().To<TemperatureChartBuilder>();
// when called in Method Y...
kernel.Bind<IChartBuilder>().To<ThresholdChartBuilder();
// TemperatureChartBuilder is a dependency of ChartDirector, need a way to dynamically
// allocate which binding to use.
var director = kernel.Get<ChartDirector>();
// without Ninject I would do
var director = new ChartDirector(new TemperatureChartBuilder);
// or
var director = new ChartDirector(new ThresholdChartBuilder);
EDIT:
结合加里的回答,并注意到 ChartDirector 有另一个依赖项的轻微编辑,我现在想做这样的事情:
var director = kernel.Get<ChartDirector>().WithConstructorArgument(kernel.Get<IChartBuilder>("TemperatureChart"));
这样的事情可能吗?
如果您只是计划使用服务位置(如示例中所示),那么根据 Garys 的回答,命名绑定可以正常工作。
然而,更好的方法是使用构造函数注入并使用属性。例如,来自 ninject wiki:
Bind<IWeapon>().To<Shuriken>().Named("Strong");
Bind<IWeapon>().To<Dagger>().Named("Weak");
...
class WeakAttack {
readonly IWeapon _weapon;
public([Named("Weak")] IWeapon weakWeapon)
_weapon = weakWeapon;
}
public void Attack(string victim){
Console.WriteLine(_weapon.Hit(victim));
}
}
根据您对加里的评论,您(奇怪的是)陷入了与我几个小时前提出的问题类似的领域。请参阅雷莫的回答:使用 WithConstructorArgument 并创建绑定类型 https://stackoverflow.com/questions/8580071/
您可以使用 When 条件来定义何时创建正确的实例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)