使用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将第三个类的相同实例注入两个依赖相关类的构造函数中

一般来说,你会使用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实例。

(提示:调用范围也可能足以解决您的问题,这取决于如何构建对象树)。