2013-06-04 33 views
15

aynı tipte birden çok örneğini çözmek, bunlarla. Her yılındaAlma birlik Birlik böyle şeylerden bile yeteneğinin olup olmadığını görmek için .Resolve kullanarak birden çok tip kayıtlarının basit kararlılığını (sonuçta enjekte yapıcı yapmak istiyorum

? vaka aşağıda, birlik sonrası 2007 davranışını etkinleştiren Veya sadece büyük ölçüde şey eksik Burada

benim kodudur am birlik bazı geçiş var mı o 2.

çözülmesi gerektiğini 0 ürün giderir:

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

Bu, bugün itibariyle Nuget'teki en son Unity paketini kullanıyordu. –

cevap

31

Unity'de yalnızca bir varsayılan kayıt olabilir (container.RegisterType<IFoo, Foo1>(); 'da olduğu gibi adsız bir kayıt). Birden fazla varsayılan kayıt gerçekleştirilirse, sonuncusu kazanır. Aynı arayüzü için birden uygulanmasını kayıt için

, o kayıtları isim atamak gerekir: Ayrıca

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

, Birlik varsayılan olarak yalnızca diziler anlıyoruz. Bir dizi olarak çözmek istiyorsanız, varsayılan davranışla iyi durumda olacaksınız.

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

başka önemli not koleksiyonu çözümlerken varsayılan kayıt iade edilmeyecektir şudur: Aksi takdirde dizinin ve benzeri ilgilenen koleksiyonu arasında bir eşleme kayıt gerekecektir. Örneğin verilen:

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

Eğer IEnumerable<IFoo> gidermek, sonuç sadece Foo2 ve Foo3 örneklerini içerecektir, ancak varsayılan kaydı dahil değildir çünkü Foo1 örneğidir olmayacaktır.

+0

Açıklık için teşekkürler! Bu çok yardımcı oldu. –

+0

@ S.Hebert yardım etmekten memnun! Birliğin bu bölümü oldukça kafa karıştırıcı ... –

+0

Bir MVC uygulamasında, var konteyner = new UnityContainer(); 've' container.Resolve() 'yapmak istediğim her yer var mı? Yoksa bunu yapmanın daha iyi bir yolu var mı? – Narayana