2013-06-04 6 views
15

の複数のインスタンスを解決するために取得する。は、私は、単純な複数のタイプの登録の決意(最終的にはコンストラクタ注入したが、Unityはそのようなことさえ可能であるかどうかを確認するために.Resolveを使ってやりたい団結は、同じタイプ

を、すべてで?ケースは以下、Unityは、ポスト2007年行動をオンに団結で、いくつかのスイッチがありますまたは私はちょうど劇的に何かが欠けています、それは2

を解決しなければならない商品を解決します。ここ

が私のコードです:?

public interface IFoo {} 
public class Foo1 : IFoo{} 
public class Foo2 : IFoo{} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<IFoo, Foo1>(); 
     container.RegisterType<IFoo, Foo2>(); 

     // container.Resolve<IEnumerable<IFoo>>(); returns 0 
     // container.ResolveAll<IFoo>(); returns 0 

     var foos = container.Resolve<IFoo[]>(); 
     Console.WriteLine(foos.Count()); 

     Console.ReadLine(); 

    } 
} 
+0

これは、今日のNugetの最新のUnityパッケージを使用していました。明瞭さのために –

答えて

31

Unityにはデフォルトの登録が1つしかありません(container.RegisterType<IFoo, Foo1>(); のような名前のない登録)。複数のデフォルト登録が実行された場合、最後の登録が優先されます。

同じインタフェースのための複数の実装を登録するためには、それらの登録に名前を割り当てる必要があります。

container.RegisterType<IFoo, Foo1>("registration1"); 
container.RegisterType<IFoo, Foo2>("registration2"); 

また、ユニティは、デフォルトで配列を理解しています。配列として解決したい場合は、デフォルトの動作で問題ありません。

container.RegisterType<IEnumerable<IFoo>, IFoo[]>(); 

もう一つの重要な注意点は、コレクションを解決するときに、デフォルトの登録が返却されないことである。そうでなければ、あなたは次のように、興味のある配列とコレクションとの間のマッピングを登録する必要があります。 は、例えば、与えられた:

container.RegisterType<IFoo, Foo1>(); 
container.RegisterType<IFoo, Foo2>("registration1"); 
container.RegisterType<IFoo, Foo3>("registration2"); 
container.RegisterType<IEnumerable<IFoo>, IFoo[]>(); 

あなたがIEnumerable<IFoo>を解決した場合、結果はFoo2Foo3のインスタンスが含まれますが、デフォルトの登録が含まれていないためFoo1のインスタンスは存在しません。

+0

ありがとう!それはとても役に立ちました。 –

+0

@ S.Hebertがお手伝いしてうれしい! Unityのその部分は公正であることをかなり混乱させています... –

+0

MVCアプリケーションでは、いつでも 'var container = new UnityContainer();'と 'container.Resolve()'を実行してもよろしいですか?それとももっと良い方法がありますか? – Narayana