Ninject功能(WhenInjectedInto)相当于Windsor

时间:2014-11-10 23:20:34

标签: c# .net dependency-injection asp.net-mvc-5 castle-windsor

这是我在这里发表的第一篇文章,希望将来能更频繁地发帖:)

我一直在努力学习使用Castle Windsor而不是使用Ninject,但是有一个功能我无法在Windsor中使用“translate”,那就是WhenInjectedInto。

这是一个从Pro ASP.NET MVC 5本书中获取的示例,其中包含Ninject

kernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
kernel.Bind<IDiscountHelper>().To<FlexibleDiscountHelper>().WhenInjectedInto<LinqValueCalculator>();

这是一个条件绑定,意味着当它绑定到IValueCalculator的LinqValueCalculator时,它应该在绑定到IDiscountHelper时使用FlexibleDiscountHelper,而不是任何其他对象。

如果有可能的话,我如何用温莎复制这个?

到目前为止,我有:

container.Register(Component.For<IValueCalculator>().ImplementedBy<LinqValueCalculator>());
container.Register(Component.For<IDiscountHelper>().ImplementedBy<FlexibleDiscountHelper>());

提前致谢, 布鲁诺

2 个答案:

答案 0 :(得分:4)

我只会使用DependsOn

container.Register(
    Component.For<IDiscountHelper>()
             .ImplementedBy<FlexibleDiscountHelper>());

container.Register(
    Component.For<IValueCalculator>()
             .ImplementedBy<LinqValueCalculator>()
             .DependsOn(Dependency.OnComponent<IDiscountHelper, FlexibleDiscountHelper>());

指定此依赖关系有多种不同的方式,如果此规范不是您所需要的,请查看the documentation

答案 1 :(得分:1)

是的,这是可能的。

与Ninject的When最接近的等价物可能是 IHandlerSelector 接口,它允许您根据某个谓词选择给定的处理程序,如果是IHandlerSelectorHasOpinionAbout方法的返回值。

Ayende has an example for how HandlerSelectors can be used on his blog.