2013-05-24 22 views
5

名前付きインスタンスを使用して同じインターフェイスに対して5つの派生クラスを登録しました。これらのすべてのクラスはシングルトン複数のインスタンスを返すシングルトンのStructuremap

For<IBaseInterface>().Singleton().Use<DerivedClass1>().Named("Derived1"); 
For<IBaseInterface>().Singleton().Use<DerivedClass2>().Named("Derived2"); 
For<IBaseInterface>().Singleton().Use<DerivedClass3>().Named("Derived3"); 

として登録されている入力に基づいてインスタンスを解決し、静的なクラスがあります。しかし、私は、ObjectFactory.GetInstanceを呼び出すたびに、シングルトンの代わりにすべてのリクエストで新しいインスタンスを返すことを確認しました。アプリケーションにスレッドはありません。

これはなぜ起こっているのですか?

編集:

静的解決ヘルパーが問題を引き起こしますか?これがインスタンスを解決する方法です。シングルトンはサンプルアプリケーションで正常に動作しますが、自分のマシンで動作しません。

さらに詳しい情報を追加するには - プロジェクトはMVC Web APIで、私はローカルIISでテストしています。私は、アプリケーションにユーザが作成したスレッドがないことを肯定的です。

public static class Resolver 
{ 
    public static IBaseInterface GetHelper(string inputParam) 
    { 
     if inputParam is "Case1" 
      return ObjectFactory.GetInstance<IBaseInterface>("Derived1") 
     //Similarly for other instances 
    } 
} 
+1

結果を繰り返すことができません。あなたの登録を行い、 'GetInstance'と' GetNamedInstance'の両方で試しました。 'GetInstance'は毎回最後に登録されたインスタンスを返します。 'GetNamedInstance(" Derived1 ")'は毎回 'DerivedClass1'の同じインスタンスを返します。 – PHeiberg

+0

はい、問題を再現する例を投稿してください。 – neontapir

+0

こんにちはPHeibergとneontapir、私は簡単なコードサンプルを作成しようとし、それでうまく動作します。しかし、私のアプリケーションでは動作しません。私はインスタンスが呼び出されている方法についていくつかの詳細を追加しました。それを確認してください。ありがとうございます – ganeshran

答えて

1

依存性注入コンテナを正しく使用していることに注意してください。たとえば、あなたの投稿に表示されるResolverクラスは、これが単なるファクトリまたはプロバイダの一種として機能するのでしょうか?

依存性注入を使用する場合は、RRRパターン(登録、解決、解放)を確実に実行し、それに従います。登録は、アプリケーションのコンポジションルートで実行する必要があります。 ASP.Net MVCの場合、コードビハインドのApplication_Startメソッドのように、通常はGlobal.asaxのどこかにあります。これは、アプリケーションプールの起動(IISの場合)ごとに1回発生する必要があります。

偶然にコンテナをインスタンス化するオブジェクト(またはコンテナをインスタンス化して登録とそれ以降の解決を行うオブジェクト)を渡す場合あなたが見ているこれらの「異なるインスタンス」は、 2つの異なる容器。コンテナの周りを回っていなくても、各リクエストの後にコンテナがガベージコレクションされ、後続のリクエストで再作成されるように、コンテナをどこかでインスタンス化すると、シングルトンの「別のインスタンス」が表示されることがありますオブジェクトが解決され、インスタンス化される。再び、それぞれが容器の異なるインスタンスから来る。これを確認する1つの方法は、コンテナから解決されたオブジェクトも同じコンテナインスタンスから取得されていることを確認することです。

HTH。

関連する問題