2016-06-12 3 views
1

私はモジュールを直接クラスとそれを使って注入しようとしています。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(); 
    } 
} 

とIMは、このような注射を引き起こし:このようなコードを使用して、このイムについて

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

アイブ氏は別のハッシュコードを得ました。私は何が欠けていますか?

答えて

2

GetHashCode()は等しいオブジェクトに対して同じハッシュコードを返します。しかし、あなたはすでにあなたの質問を知っています。

あなたのコードでは、Ninjectカーネルで2つの別々の登録が行われています。予想どおり1つではなく2つのシングルトンが作成されます。もし単純なインジェクター(選択した私のDIコンテナ)がそうするように、Ninjectがこの簡単な間違いを警告してくれればいいでしょう。同じ実装に複数のインターフェースまたは登録キーバインディング

はNinjectにこのように実行する必要があります。Ninject v3のよりよい解決策があるに

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

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

はどうもありがとうございましたが、とこれに関するもう1つの質問 これまでに行ったように、別のインターフェースを持つ1つのクラスの注入を行うためにsepareteモジュールを使用できますか?私は少数のロジックを少数のモジュールに分けたいと思いますが、あなたの答えは私の問題の最大の部分を解決するのに役立ちます。ありがとうございました。 – daspisch

+0

わかりません。 v3の構文では、明らかにできません。 –

関連する問題