如何将实例ninject传递到构造函数中

本文关键字:构造函数 ninject 实例 | 更新日期: 2023-09-27 18:27:35

我不理解ninject singleton的这种行为。这里有一个简单的例子。

void Main()
{
    IKernel kernel = new StandardKernel();
    kernel.Bind<IB>().To<B>().InSingletonScope();
    kernel.Bind<B>().To<B>().InSingletonScope();
    C c = kernel.Get<C>();
    B b = kernel.Get<B>();
    B b2 = kernel.Get<B>();
    ReferenceEquals(c.b, b); //false
    ReferenceEquals(b, b2); //true
}
public interface IB
{ }
public class B : IB
{ }
public class C
{
    public IB b;
    public C(IB b)
    {
        this.b = b;
    }
}

我不明白为什么ReferenceEquals(c.b, b)返回false。

我曾假设,如果我将一个对象声明为singleton,那么ninject将只使用该对象的一个实例,但事实并非如此。

根据我的测试,它似乎使用一个实例进行构造函数注入,并且在调用kernel.Get时返回一个实例给我。

我希望kernel.Get向我返回用于构造函数注入的同一实例。这可能吗?

如何将实例ninject传递到构造函数中

C依赖于IB,而不是B

如果你这样做:

IB ib = kernel.Get<IB>();

并将其与类似的c.b进行比较:

var eq = ReferenceEquals(c.b, ib);

你会得到true

您所做的每个注册(BIB)都会为您提供不同的单例。

如果你想拥有相同的singleton,你可以这样做一个单一的注册:

kernel.Bind<IB,B>().To<B>().InSingletonScope();

我刚刚解决了自己的问题。

这是因为我在B上调用kernel.Get,而不是IB

void Main()
{
    IKernel kernel = new StandardKernel();
    kernel.Bind<IB>().To<B>().InSingletonScope();
    kernel.Bind<B>().To<B>().InSingletonScope();
    C c = kernel.Get<C>();
    B b = kernel.Get<B>();
    B b2 = kernel.Get<B>();
    IB b3 = kernel.Get<IB>();
    ReferenceEquals(c.b, b); //false
    ReferenceEquals(c.b, b3); //true
    ReferenceEquals(b, b2); //true
}