我对 Ninject 比较陌生,我正在尝试找出一组相对复杂的依赖项。
基本上我得到的是以下依赖链:
class A {
public A(IB b, IC c) { }
}
class B : IB {
public B(IC c) { }
}
class C : IC { }
class SimulatedC : IC { }
class SimulatedA : A {
public SimulatedA(IB b, IC c) : base(b, c) { }
}
模块初始化绑定如下:
- 注入 A 时将 IC 与 C 结合
- 注入 SimulatedA 时将 IC 绑定到 SimulatedC
现在,问题来了。因为bothA
和SimulatedA
both injects B
,并且因为B
injects IC
,我不知道如何设置依赖链来获得正确的IC
实现注入B
。
这是我尝试过的:
this.Bind<IC>().To<C>().WhenInjectedInto<A>();
this.Bind<IC>().To<SimulatedC>()
.WhenInjectedInto<SimulatedA>();
B
结果是这里没有描述绑定到,而是B
从SimulatedA
被注入C
而不是SimulatedC
.
我试过这样做:
this.Bind<IC>().To<C>().InCallScope();
this.Bind<IC>().To<SimulatedC>().InCallScope();
但是 NInject 只是嘲笑我。(多个绑定异常。)
有什么帮助吗?
谢谢!
更新:我想出了一种方法来做到这一点:
this.Bind<IC>().To<C>().WhenNoAncestorMatches(ShouldBeSimulated);
this.Bind<IC>().To<SimulatedC>()
.WhenAnyAncestorMatches(ShouldBeSimulated);
private static bool ShouldBeSimulated(IContext context)
{
var request = context.Request.ParentRequest;
while (request != null)
{
if (request.Service == typeof (SimulatedA))
{
return true;
}
request = request.ParentRequest;
}
return false;
}
这是最好的方法吗?