0

複数のWeb APIコントローラーを含むASP.NET Web APIを使用しています。各コントローラはIMessageSenderに依存します。 CloudMessageSender、InMemoryMessageSenderとNServiceBusMessageSender - コントローラーを作成するUnityからの名前解決の解決

public class OrderController: ApiController { 
    private readonly IMessageSender _msgSender; 
    public OrderController(IMessageSender msgSender) { 
     _msgSender = msSender; 
    } 
} 

私はIMessageSenderの異なる3つの異なる実装を持っています。

public class CloudMessageSender: IMessageSender 
{ 
} 
public class InMemoryMessageSender: IMessageSender 
{ 
} 
public class NServiceBusMessageSender: IMessageSender 
{ 
} 

私が直面しています問題は、異なるコントローラのため、私は別のを使用する必要があるということです依存関係の解決のためのUnityとUnity.WebApiを使用していますし、IMessageSender

container.RegisterType<IMessageSender, CloudMessageSender>("res-cloud"); 
container.RegisterType<IMessageSender, InMemoryMessageSender>("res-inmem"); 
container.RegisterType<IMessageSender, NServiceBusMessageSender>("res-nsvc"); 

の3件のという名前の登録を登録していますIMessageSenderの実装。 Ex。 OrdersControllerCloudMessageSenderを使用する必要がありますが、CustomersControllerInMemoryMessageSenderを使用する必要があります。デフォルトでは、Unityは名前のない解決法または私の場合は最初のものを注入します。

IMessageSenderのどのインプリメンテーションを注入するコントローラを指定するか、制御するにはどうすればよいですか?

+0

http://stackoverflow.com/questions/18665324/unity-register-for-one-interface-multiple-object-and-tell-unity-where-to-inject –

+0

名前付き登録を開始すると、 [Pure DI](http://blog.ploeh.dk/2014/06/10/pure-di/)に切り替える方がよいでしょう。詳細については、この記事を参照してください:http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/ –

答えて

1

コントローラタイプにも注入部材を登録するようにコンテナを設定できます。インジェクションメンバーのリストでは、すでに登録されている依存関係を名前で解決できます。このようにして、コントローラーインスタンスの作成時に正しいタイプが解決されることを確認します。 OrderControllerインスタンスが初期化されるときに

container.RegisterType<IMessageSender, CloudMessageSender>("res-cloud"); 
container.RegisterType<IMessageSender, InMemoryMessageSender>("res-inmem"); 
container.RegisterType<IMessageSender, NServiceBusMessageSender>("res-nsvc"); 

var messageSender = new ResolvedParameter<IMessageService>("res-cloud"); 
container.RegisterType<OrderController>(new InjectionConstructor(messageSender)); 

は今、msgSender引数の型がCloudMessageSenderに解決されます。

コントローラを登録するこの方法の1つの問題は、コントローラのコンストラクタのすべてのパラメータを解決して渡す必要があることです。

Unityは、このアプローチを使用せずに名前に基づいたタイプの解決をサポートしていません。

+0

"Unityは、ベースのタイプの解決をサポートしていませんこのアプローチを使用しないで - これは、Unityを使用しないことが良い理由です。数年後に更新されていないという事実は別のものです。 – NightOwl888

+0

それを使用するかどうかは、場合によって異なります。 MVCでユニットを使用すると、Castle Windsorなどの他のユニットと比較して設定と構成が簡単になります。同意すると、UnityはIoCコンテナと一致するようにアップグレードする必要があります。 –

関連する問題