使用 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();
我正在尝试通过直接 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();