C# 使用Ninject作为单例进行多次注入
我试图通过it direct类和it接口注入一个模块。对于此im,使用如下代码:C# 使用Ninject作为单例进行多次注入,c#,dependency-injection,ninject,C#,Dependency Injection,Ninject,我试图通过it direct类和it接口注入一个模块。对于此im,使用如下代码: interface ITestInterface { void WriteHash(); } class TestClass : ITestInterface { public void WriteHash() => Console.WriteLine(GetHashCode()); } class FirstModule : NinjectModule { public over
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();
接口ITestInterface{
void WriteHash();
}
类TestClass:ITestInterface{
public void WriteHash()=>Console.WriteLine(GetHashCode());
}
类FirstModule:Ninject模块{
公共覆盖无效负载(){
Bind().ToSelf().InSingletonScope();
}
}
第二类模块:Ninject模块{
公共覆盖无效负载(){
绑定().To().InSingletonScope();
}
}
当我注射这种药物时:
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();
ninject模块[]模块={new FirstModule(),new SecondModule()};
IKernel内核=新的标准内核(模块);
var foo=kernel.Get();
foo.WriteHash();
var bar=kernel.Get();
bar.WriteHash();
我有一个不同的散列码。我缺少什么?GetHashCode()
为相等的对象返回相同的hashcode。但这你已经知道了,所以你的问题
您的代码在Ninject内核中进行了两个单独的注册,它不会像您所期望的那样创建1,而是创建两个单例。如果Ninject警告您这个容易犯的错误,例如SimpleInjector(我选择的DI容器),那就太好了
在Ninject中,必须像这样将多个接口或注册密钥绑定到同一个实现:
Bind<TestClass>().ToSelf().InSingletonScope();
Bind<ITestInterface>().ToMethod(c => c.Kernel.Get<TestClass>());
Bind().ToSelf().InSingletonScope();
Bind().ToMethod(c=>c.Kernel.Get());
在Ninject v3中有一个更好的解决方案:
Bind<TestClass, ITestInterface>().To<TestClass>().InSingletonScope();
Bind().To().InSingletonScope();
非常感谢,还有一个问题:我可以像以前那样使用Separate模块将一个类与不同的接口进行注入吗?我想将injeciton逻辑划分为几个模块,但您的回答帮助我解决了问题的最大部分。再次谢谢你,我不确定。使用v3语法显然不能。