1

我对 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

现在,问题来了。因为bothASimulatedAboth injects B,并且因为Binjects IC,我不知道如何设置依赖链来获得正确的IC实现注入B

这是我尝试过的:

this.Bind<IC>().To<C>().WhenInjectedInto<A>();
this.Bind<IC>().To<SimulatedC>()
    .WhenInjectedInto<SimulatedA>();

B结果是这里没有描述绑定到,而是BSimulatedA被注入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;
}

这是最好的方法吗?

4

0 回答 0