2016-06-12 5 views
1

Ich versuche, ein Modul von ihm direkte Klasse und über die Verwendung der Schnittstelle zu injizieren. Für diese im wie dies mit Code:Mehrere Injektionen als Singleton mit Ninject

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(); 
    } 
} 

Und wenn im verursacht Injektionen wie folgt aus:

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(); 

Ive eine andere Hash-Codes bekam. Was vermisse ich?

Antwort

2

GetHashCode() gibt den gleichen Hashcode für Objekte zurück, die gleich sind. Aber das weißt du schon deshalb deine Frage.

Ihr Code macht zwei separate Registrierungen im Ninject Kernel und es wird nicht wie erwartet 1 erzeugt, sondern zwei Singletons. Es wäre schön gewesen, wenn Ninject dich davor gewarnt hätte, so leicht Fehler zu machen, wie zum Beispiel Simple Injector (mein DI-Container der Wahl).

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

In Ninject v3 gibt es eine schönere Lösung:

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

Vielen Dank, und

mehrere Schnittstellen oder Registrierungsschlüssel auf die gleiche Implementierung Bindung müssen, wie dies in Ninject erfolgen noch eine Frage dazu: Kann ich separate Module verwenden, um eine Klasse mit verschiedenen Schnittstellen zu injizieren, so wie ich das vorher gemacht habe? Ich möchte die Injizierungslogik auf wenige Module aufteilen, aber Ihre Antwort hilft mir, den größten Teil meines Problems zu lösen. Danke nochmal. – daspisch

+0

Ich bin mir nicht sicher. Mit der v3-Syntax kannst du das natürlich nicht. –