2010-11-18 17 views
2

私は3つの異なる実装を持つインターフェースを持っています。 Unityコンテナを使用してWebアプリケーションのWeb.configに3つの実装を名前付きエイリアスとして登録します。UnityContainer:解決時の条件ロジック

いくつかのロジックに基づいて、登録されたインスタンスの1つを解決する方法がUnityを使用していますか。ロジックは、どの実装が解決されるべきかを決定するためにDBに連絡することを含む。

あなたのお手伝いをお待ちしております。

よろしく ビラル

あなたは抽象的な工場でロジックを実装し、それを注入することができる

答えて

2

public interface IMyInterface { } 

public interface IMyInterfaceFactory { 
    IMyInterface GetMyInterface(); 
} 

public class MyInterfaceFactory : IMyInterfaceFactory { 
     private readonly IUnityContainer _container; 
     public MyInterfaceFactory(IUnityContainer container) { 
      _container = container; } 

     IMyInterface GetMyInterface() { 
      var impName = Get_implementation_name_from_db(); 
      return container.Resolve<IMyInterface>(impName); 
     } 
} 
+0

ご回答いただきありがとうございます。私はSOCが増えるにつれて第2のアプローチを優先しました。 – Bill

+0

+1。いい答え! – Steven

+0

こんにちは、上記の質問をお願いします。 In "IMyInterface"内のメソッドの1つが何らかの入力を必要とする場合。私のアプリケーションでは、Unityに登録されているICacheManagerがあります。メソッドにパラメータを1つずつ渡すか、メソッドでICacheManagerを使用してデータを取得させる方が良いでしょうか?ユニットテストまたは懸念の視点の分離は推奨されますか?おかげで – Bill

1

あなたが知っている「ルータの実装を作成する方法の一つにルーティング要求をします他の実装:

// Here is a possible implementation of the router. There are 
// of course many ways to do this. 
public class MyRouterImpl : IMyInterface 
{ 
    List<IMyInterface> implementations = new List<IMyInterface>(); 

    public MyRouterImpl(MyImpl1 i1, MyImpl2 i2, MyImpl3 i3) 
    { 
     this.implementations.Add(i1); 
     this.implementations.Add(i2); 
     this.implementations.Add(i3); 
    } 

    void IMyInterface.Method() 
    { 
     int indexOfImplementationToExecute = 
      GetIndexOfImplementationToExecute(); 

     IMyInterface impl = 
      this.implementations[indexOfImplementationToExecute]; 

     impl.Method(); 
    } 
} 
関連する問題