Ответ 1
Ninject поддерживает четыре встроенных области видимости из коробки: 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 { }