2017-04-03 6 views
0

私は.NetアプリケーションでDIを実装しようとしています。私は自分のデータアクセス層に3つのAPIクラスを持っています。私は一度にそれらのいずれかを使用しなければならない。私は条件付き統一決議をしようとしていますが、それを達成する方法は不明です。私の3つの注入されたクラスを条件付きで管理する方法をいくつかのボディに教えてください。あなたはこのようなあなたの登録コードを記述することができるように複数の依存関係を解決するためのUnity Containerの設定方法は?

は現在、私はちょうど、way-

  IUnityContainer _container = new UnityContainer(); 
      _container.RegisterType(typeof(IPolicyAdminApi), typeof(SomeApiclass1)); 
      _container.RegisterType(typeof(IPolicyAdminApi), typeof(SomeApiclass2)); 
      _container.RegisterType(typeof(IPolicyAdminApi), typeof(SomeApiclass3)); 
      IPolicyAdminApi policyAdmin = _container.Resolve<IPolicyAdminApi>(); 
      return policyAdmin; 
+0

私は提案を投稿しましたが、なぜ3つの方法で1つのサービスが実装されているのか自分自身に尋ねるべきです - 3つの別々のサービス(つまり3つの別々のインターフェイス)を持つべきではないと確信していますか? ? –

答えて

1

Unityは、この曖昧さ回避を可能にするために登録を命名サポートし、以下に私のクラスを登録している:

IUnityContainer _container = new UnityContainer(); 
_container.RegisterType("A", typeof(IPolicyAdminApi), typeof(SomeApiclass1)); 
_container.RegisterType("B", typeof(IPolicyAdminApi), typeof(SomeApiclass2)); 
_container.RegisterType("C", typeof(IPolicyAdminApi), typeof(SomeApiclass3)); 
IPolicyAdminApi policyAdmin = _container.Resolve<IPolicyAdminApi>("A"); 
return policyAdmin; 

ますUnity Dependencyアトリビュートを使用して、必要な登録を指定できます。

+0

これは素晴らしい考えです。助けになる 。しかし、私は実行時にこの依存関係を解決したい。現在、 "A"を解決するように設定しています。ここで条件を付け加えれば、3つのクラスすべてに条件を加えることができるということですか? –

+0

@PratikBompilwarその場合は、 'Factory'パターンを調べる' IPolicyAdminApiFactory'を構築したいと思うでしょう。あなたが実際に何をしているのかは少し不明です。 –

+0

助けてくれてありがとう@RB。名前を指定して、それ以外の場合は条件を入れてください。 –

1

別の回答で示唆されているように、UnityIoCのソリューションはNamed Registrationで、工場と組み合わされています。あなたは典型的なファクトリパターンを行いますが、私は完全な依存性注入に、行ってきた、関数として、工場を注入される可能性:

登録で

// Register the named instances. 
_container.RegisterType<IPolicyAdminApi, SomeApiclass1>("Name1"); 
_container.RegisterType<IPolicyAdminApi, SomeApiclass2>("Name2"); 
_container.RegisterType<IPolicyAdminApi, SomeApiclass3>("Name3"); 

// Register the factory. 
_container.RegisterType<Func<string, IPolicyAdminApi>>(
      new InjectionFactory(c => 
       new Func<string, IPolicyAdminApi>(
        namedInstance => c.Resolve<IPolicyAdminApi>(namedInstance)))); 

クラスで

class ImUsingTheRegistration 
{ 
    private Func<string, IPolicyAdminApi> iPolicyAdminApiFactory; 

    public ImUsingTheRegistration(Func<string, IPolicyAdminApi> iPolicyAdminApiFactory) 
    { 
     this.iPolicyAdminApiFactory = iPolicyAdminApiFactory; 
    } 

    public void ImAtRunTime() 
    { 
     string namedInstance = "Name" + Datetime.Now.ToString().Right(1); 

     IPolicyAdminApi instance = iPolicyAdminApiFactory(namedInstance); 
    } 
} 

注:私は、一般的な登録を使用していますが、それはあまりにも他のパターンで動作します。また、それは4,5、... 0の登録がないので失敗するだろうが、あなたはそのアイデアを得る。

+0

ありがとう@Tipx。インスタンスの命名は私の目標に役立ちます。 –

関連する問題