Ninject支持四個內置object scopes out of the box:瞬態,單例,線程,請求。
所以沒有任何PerResolveLifetimeManager
類似的範圍,但你可以很容易地實現它與註冊自定義範圍與InScope
方法。
事實證明,有一個現有的Ninject擴展:ninject.extensions.namedscope
它提供了InCallScope
方法,這正是你正在尋找的。
但是,如果您想自己做,您可以使用自定義InScope
代表。在這裏您可以使用主IRequest
對象類型A
使用它的範圍對象:
var kernel = new StandardKernel();
kernel.Bind<A>().ToSelf().InTransientScope();
kernel.Bind<B>().ToSelf().InTransientScope();
kernel.Bind<C>().ToSelf().InTransientScope();
kernel.Bind<D>().ToSelf().InScope(
c =>
{
//use the Request for A as the scope object
var requestForA = c.Request;
while (requestForA != null && requestForA.Service != typeof (A))
{
requestForA = requestForA.ParentRequest;
}
return requestForA;
});
var a1 = kernel.Get<A>();
Assert.AreSame(a1.b.d, a1.c.d);
var a2 = kernel.Get<A>();
Assert.AreSame(a2.b.d, a2.c.d);
Assert.AreNotSame(a1.c.d, a2.c.d);
當樣品類:
public class A
{
public readonly B b;
public readonly C c;
public A(B b, C c) { this.b = b; this.c = c; }
}
public class B
{
public readonly D d;
public B(D d) { this.d = d; }
}
public class C
{
public readonly D d;
public C(D d) { this.d = d; }
}
public class D { }
如果D也是一部分,如果依賴鏈不包含A? –
@KevinBabcock。不,它不會中斷。然後,委託將返回'null',這相當於下面的註冊:'kernel.Bind().ToSelf()。InTransientScope();' –
nemesv
感謝您的澄清。好答案! –