C# 使用ninject将第三个类的同一实例注入到两个相关类的构造函数中
说我有C# 使用ninject将第三个类的同一实例注入到两个相关类的构造函数中,c#,dependency-injection,ninject,C#,Dependency Injection,Ninject,说我有 public class A { public A(IFoo foo, B bar); } 及 如何设置绑定,以便为每个a创建一个IFoo的新实例,但将IFoo的相同实例注入B,注入a的IFoo 实际上,我希望实现 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
public class A {
public A(IFoo foo, B bar);
}
及
如何设置绑定,以便为每个a创建一个IFoo的新实例,但将IFoo的相同实例注入B,注入a的IFoo
实际上,我希望实现
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)
var a=Kernel.Get();
断言(a.Foo==a.B.Foo)
我会像下面这样开始,这将无法实现这一点。我不知道如何设置绑定约束。也许这样做是不可能的,甚至是不可取的
Kernel.Bind<A>.ToSelf();
Kernel.Bind<IFoo>.To<Foo>();
Kernel.Bind<B>.ToSelf();
Kernel.Bind.ToSelf();
Bind.To();
Kernel.Bind.ToSelf();
一般来说,您会使用ninject的“范围”功能:
针对您的问题,您可以使用NamedScope,它在NamedScope扩展中提供:
private const string FooScopeName=“FooScope”;
Kernel.Bind()到()
.DefinesNamedScope(食品范围名称);
Kernel.Bind().ToSelf()
.InNamedScope(食品范围名称);
Kernel.Bind().ToSelf();
这样做的效果是,注入到IFoo
实例中的所有依赖项(以及它们的依赖项等等-->在IFoo
实例中生根的整个对象树)都将获得与A
相同的实例
(提示:调用范围可能也足以解决您的问题,具体取决于对象树的构建方式)
Kernel.Bind<A>.ToSelf();
Kernel.Bind<IFoo>.To<Foo>();
Kernel.Bind<B>.ToSelf();
private const string FooScopeName = "FooScope";
Kernel.Bind<IFoo>().To<Foo>()
.DefinesNamedScope(FooScopeName);
Kernel.Bind<A>().ToSelf()
.InNamedScope(FooScopeName);
Kernel.Bind<B>().ToSelf();