使用ninject将第三个类的相同实例注入到两个相关类的构造函数中

时间:2014-06-05 09:43:55

标签: c# dependency-injection ninject

说我有

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();

1 个答案:

答案 0 :(得分:2)

一般来说,你会使用&#34;范围&#34; ninject的特点: 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实例的所有依赖项(及其依赖项等等 - &gt;根据IFoo实例生成的整个对象树)将获得相同的实例A

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