使用ninject将第三个类的相同实例注入两个依赖相关类的构造函数中
本文关键字:两个 依赖 构造函数 注入 三个 使用 ninject 实例 | 更新日期: 2023-09-27 18:07:03
假设我有
public class A {
public A(IFoo foo, B bar);
}
和
public class B {
public B(IFoo foo)
}
我如何设置绑定,以便为每个 a 创建一个新的IFoo实例,但是IFoo的相同实例被注入到B中,而注入到 a B中?
实际上我想达到
var foo = new Foo();
var b = new B(foo);
var a = new A(foo, b);
var foo2 = new Foo();
var b2 = new B(foo2);
var a2 = new A(foo2, b2);
理想情况下,如果我调用
,上述情况将神奇地发生。var a = Kernel.Get<A>();
assert(a.Foo == a.B.Foo)
我会像下面这样开始,这不会实现这一点。我不知道如何设置绑定约束。也许这样做是不可能的,甚至是不可取的。
Kernel.Bind<A>.ToSelf();
Kernel.Bind<IFoo>.To<Foo>();
Kernel.Bind<B>.ToSelf();
一般来说,你会使用ninject的"scope"特性:https://github.com/ninject/ninject/wiki/Object-Scopes
针对您的问题,您可以使用NamedScope,它可以在NamedScope扩展中获得:https://github.com/ninject/ninject.extensions.namedscope:
private const string FooScopeName = "FooScope";
Kernel.Bind<IFoo>().To<Foo>()
.DefinesNamedScope(FooScopeName);
Kernel.Bind<A>().ToSelf()
.InNamedScope(FooScopeName);
Kernel.Bind<B>().ToSelf();
这样做的效果是,所有注入到IFoo
实例的依赖项(以及它们的依赖项等等——>整个对象树扎根于IFoo
实例)将得到相同的A
实例。
(提示:调用范围也可能足以解决您的问题,这取决于如何构建对象树)。