Ninjectは、すぐに使用できる4つの組み込みオブジェクトスコープ(Transient、Singleton、Thread、Request)をサポートします。
したがって、同様のスコープはありません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 { }