使用 Ninject 作为单例进行多次注入

Multiple injections as singleton using Ninject

我正在尝试通过直接 class 并使用它的接口来注入模块。为此,我使用如下代码:

interface ITestInterface {
    void WriteHash();
}

class TestClass : ITestInterface {
    public void WriteHash() => Console.WriteLine(GetHashCode());
}

class FirstModule : NinjectModule {
    public override void Load() {
        Bind<TestClass>().ToSelf().InSingletonScope();
    }
}

class SecondModule : NinjectModule {
    public override void Load() {
        Bind<ITestInterface>().To<TestClass>().InSingletonScope();
    }
}

当我造成这样的注射时:

NinjectModule[] modules = { new FirstModule(), new SecondModule() };
IKernel kernel = new StandardKernel(modules);
var foo = kernel.Get<TestClass>();
foo .WriteHash();
var bar = kernel.Get<ITestInterface>();
bar .WriteHash();

我有不同的哈希码。我错过了什么?

GetHashCode() returns 相等对象的相同哈希码。但这你已经知道因此你的问题。

您的代码在 Ninject 内核中进行了两次单独的注册,它不会像您期望的那样创建 1,而是创建两个单例。如果 Ninject 会警告你这个容易犯的错误就好了,例如 Simple Injector(我选择的 DI 容器)就可以了。

在Ninject中必须像这样将多个接口或注册密钥绑定到同一实现:

Bind<TestClass>().ToSelf().InSingletonScope();
Bind<ITestInterface>().ToMethod(c => c.Kernel.Get<TestClass>());

在Ninject v3中有一个更好的解决方案:

Bind<TestClass, ITestInterface>().To<TestClass>().InSingletonScope();