Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Ninject作为单例进行多次注入_C#_Dependency Injection_Ninject - Fatal编程技术网

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

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

我试图通过it direct类和it接口注入一个模块。对于此im,使用如下代码:

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语法显然不能。