2016-05-24 7 views
0

.NETアプリケーションの1つでStructureMap IOCコンテナを使用しようとしています。依存性注入:関数で解決する

私は、サービスから受信したメッセージに基づいて何らかのアクションを実行する一連のIMessageHandlerを実装しています。各実装にはさまざまな依存関係があります。

現在、メッセージを受信すると、これらのハンドラの新しいインスタンスを作成しています。

これはローカルメソッドで発生するため、これらのメッセージハンドラに依存関係を提供するためにどのようにStructureMapを使用しますか?コンテナを注入してメッセージハンドラを作成する必要がありますか?

+0

ここでそれらを注入するために、リストの注入を使用することができますか?ハンドラに状態が含まれていますか? –

+0

私は新しいハンドラを作成する必要はありませんが、メッセージのタイプとメッセージハンドラの間のマッピングが必要です。どこでメッセージハンドラを初期化するのですか? –

+0

[Composition Root](http://blog.ploeh.dk/2011/07/28/CompositionRoot/)にハンドラを作成し、クラスに 'Dictionary 'を挿入します。このような辞書には、既に構築された 'IMessageHandler'インスタンスが含まれます。 –

答えて

0

ヤコブは私が上記のコメントですべきことを述べました。

public class MessageHandlerResolver : IMessageHandlerResolver 
{ 
    private IEnumerable<IMessageHandler> handlers; 
    public MessageHandlerResolver(IEnumerable<IMessageHandler> handlers) 
    { 
     this.handlers = handlers; 
    } 

    public IMessageHandler Resolve(Type type) 
    { 
     IMessageHandler handler = handlers.FirstOrDefault(h => h.MessageType == type); 
     if(handler == null) 
     { 
      throw new ArgumentException("No handler found for message type " + type.ToString(), "type"); 
     } 
     return handler; 
    } 
} 

その後、IOCコンテナにあなたのメッセージハンドラを設定し、メッセージごとに新しいメッセージハンドラを作成する必要がありますなぜ