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,注入aIFoo

实际上,我希望实现

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