2013-05-28 13 views
9

私のStructureMapブートストラップコードでは、アセンブリをスキャンし、名前付きインスタンスとしてオブジェクトグラフにインターフェイス/実装のペアを追加するためのカスタム規約を使用しています。名前付きインスタンスとStructureMapの既定のインスタンス?

registry.For(interfaceType).Use(type) 
    .Named(implementationName); 

これは十分という名前のインスタンスをすべて追加します。基本的に私は、様々な条件に応じて、この声明に至る構成設定と訓練をチェックするいくつかのロジックを持っています。ただし、インスタンス名が指定されていない場合は、デフォルトのインスタンスを追加することもできます。ただし、デフォルトのインスタンスは必ずしもグラフに最後に追加されるインスタンスではありません。スキャン中に後で別の名前のインスタンスが追加されることがあります。ただし、名前が付けられているかどうかにかかわらず、最後に追加されたインスタンスは常にデフォルトであるように見えます。

私には、流暢なAPIの様々な組み合わせを試してみた:

registry.For(interfaceType).Add(type); 

か:

registry.For(interfaceType).Use(type); 

をしても、いくつかの非推奨としてマークされたものの。しかし、結果として生じる動作は、常に最後のものがデフォルトです。だから、追加実装の順序は次のようなものである場合:

  1. ロガー・インターフェースについては
  2. 「log4netの」という名前のlog4netの実装を使用するロガーインターフェース用ロガーインターフェイスのデフォルト
  3. によってlog4netの実装を使用"Mock"という名前のMock実装を使用してください。

結果として、名前が指定されていない場合、デフォルトとして "Mock"実装が使用されます。コンテナ内のAllInstancesへのデバッグ、私は次の順序で参照してください。

  1. 「log4netの」
  2. という名前のlog4netのロガーGUIDとlog4netのロガーのインスタンスのインスタンス名のために(他のデフォルトのように例えば、私の知る限り)

デバッグ、しかし、インスタンス名なしでコンテナからモック実装で結果を呼ばloggingステートメントに「モック」という名前のモックロガーのインスタンスを言うことができるように使用されています。

オブジェクトグラフにデフォルトインスタンスを追加しても、後で名前付きインスタンスを追加できる方法はありますか?

答えて

20

Addメソッドはインスタンスを追加します(名前付きインスタンスを追加するか、コレクション/列挙型で使用する複数のインスタンスを追加する必要がある場合)。明示的なデフォルトが登録されていない場合(Useメソッドを使用)、最後に追加されたインスタンスがデフォルトのインスタンスになります。 Useメソッドは、デフォルトインスタンスを設定するためのものです。 Useを複数回呼び出すと、最後に登録されたインスタンスがデフォルトになります。あなたはこのようにそれを行うことができる必要があり、さらに指定されたインスタンスを既定のインスタンスを設定し、登録するためには

は:

registry.For(typeof(Logger)).Use(typeof(Log4Net)).Named("Log4Net"); 
registry.For(typeof(Logger)).Add(typeof(Mock)).Named("Mock"); 

これがLog4Netインスタンスデフォルトと名前付きインスタンスとしてもアクセスできるようになります。 Mockインスタンスは、名前付きインスタンスとして使用できます。

関連する問題