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

标签 c# singleton ninject

我不明白 ninject 单例的这种行为。这是一个简单的例子。

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。

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

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

我想要的是 kernel.Get 返回给我用于构造函数注入(inject)的相同实例。这可能吗?

最佳答案

C依赖于IB,而不是B

如果你这样做:

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

并将其与 c.b 进行比较,如下所示:

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

你会得到true

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

如果你想拥有相同的单例,你可以像这样进行单一注册:

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

关于c# - 如何将实例 ninject 传递到构造函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34404777/

相关文章:

nhibernate - Ninject 和单例

c# - 如何使用MVVM模式启动错误弹出窗口?

c# - 使用 owin 和 ninject 的 webapi 应用程序中的无参数构造函数问题

c# - 使用 Superpower 解析简单的文本语法

java - NoClassDefFoundError Singletonholder

php单例在自动加载器类中不断调用自己两次

java - 单例进入无限循环

c# - 将 Ninject 与 ASP.NET MVC 和服务层结合使用

c# - 在 Visual Studio 中检查使用指令引用

c# - 权限不足,无法添加 Azure AD 用户