2017-06-23 25 views
1

上の2つのインターフェイスをマッピングしたときに、誤った登録が私は2つのインターフェースを実装するクラスを持って適用されます正しい登録が使用されます。ここではユニティコンテナ同じクラス

var container = new UnityContainer(); 

container 
    .RegisterType<IA, C>(new InjectionConstructor(1)) 
    .RegisterType<IB, C>(new InjectionConstructor(2)); 

var a = container.Resolve<IA>(); 

a.X.ShouldBe(1); // Actually it's 2 

私はa.X取得していますが2の代わりに、したがって、第2の登録ではなく、最初の1の使用されている1.等しいです。

上記の登録が互いに干渉する理由を説明できる人は誰ですか?それにはまったく根本的な理由はありますか?

答えて

1

(簡体字)、高レベルのユニティ店舗解決するときに使用されている二つの情報から:心に留めておくべき

  1. 型マッピング
  2. ビルドプラン

キーポイントでありますそのタイプ・マッピングとターゲット・タイプの構築は、別個の離散ステップです。

タイプマッピングでは、「from」タイプと「to」タイプの間のマッピングが格納されます。したがって、サンプルコードIA =>CおよびIB =>Cです。

ビルドプランには、 "to"ターゲットタイプを構築するために必要なステップが含まれています。この場合、タイプはCです。

ので

.RegisterType<IA, C>(new InjectionConstructor(1)) 

が呼び出されたときに型マッピングはCIAから作成され、ターゲット・タイプCに関連付けられたビルド計画戦略が作成され、メモリに保存されています。

.RegisterType<IB, C>(new InjectionConstructor(2)); 

は、タイプマッピングはCIBから作成され、ビルド計画の戦略が関連付けられて呼び出されたときにビルドプランの戦略は、デフォルトの寿命マネージャと1

次の値を持つInjectionConstructorが含まれますターゲットタイプCがメモリ内で更新されます。これにより、InjectionConstructor(1)の代わりにInjectionConstructor(2)を使用するようにビルド計画の戦略が変更されます。

は今定義された2つの型マッピング(IA = CIB =>C)が、Cため、まだ一つだけのビルド計画があります。そのため、解決は1の代わりに2の値を返します(Cを直接解決し、X:container.Resolve<C>()の値をチェックすることでこれを確認できます)。

同じターゲットタイプのビルドプランを複数作成する場合は、名前付き登録を使用できます。たとえば、fromインターフェース(または必要な他の文字列値)の名前を使用して登録することができます。

var container = new UnityContainer(); 

container 
    .RegisterType<IA, C>(typeof(IA).Name, new InjectionConstructor(1)) 
    .RegisterType<IB, C>(typeof(IB).Name, new InjectionConstructor(2)); 

var a = container.Resolve<IA>(typeof(IA).Name); 

a.X.ShouldBe(1); // will be 1 
関連する問題