说我有
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();
答案 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
。
(提示:调用范围可能也足以解决您的问题,具体取决于构建对象树的方式)。