2010-11-17 38 views
9

Belirli bir arabirim türü için sınıfların bir listesini 'oluşturmak' için microsoft birliğini nasıl edinebilirim?Birlik Birden Çok Sınıfı Çözümleme

Çok Basit bir örnek:

List<IShippingCalculation> list = new List<IShippingCalculation>(); 
    list.Add(new NewYorkShippingCalculation()); 
    list.Add(new FloridaShippingCalculation()); 
    list.Add(new AlaskShippingCalculation()); 

    //Not What I want 
    public void calcship(List<IShippingCalculation> list) 
    { 
    var info = new ShippingInfo(list); 
    info.CalculateShippingAmount(State.Alaska) 
    } 

    //Somehow in unity, must i do this for all the concrete classes? 
    //how does it know to give a list. 
    Container.RegisterType<IShippingInfo,new AlaskaShippingCalculation()>();?? 

    //What I want 
    public void calcship(IShippingInfo info) 
    { 
    info.CalculateShippingAmount(State.Alaska) 
    } 

Teşekkür! Eğer Unity 2 kullanıyorsanız

cevap

13

Eğer sen ResolveAll yalnızca adlandırılmış kayıtları dönecektir çünkü her kayıt için bir isim vermek zorunda ResolveAll<T>

Container.RegisterType<IShippingInfo,FloridaShippingCalculation>("Florida"); 
Container.RegisterType<IShippingInfo,NewYorkShippingCalculation>("NewYork"); 
Container.RegisterType<IShippingInfo,AlaskaShippingCalculation>("Alaska"); 

IEnumerable<IShippingInfo> infos = Container.ResolveAll<IShippingInfo>(); 

kullanabilirsiniz.

+0

Bu, kurucumda nasıl çözer? – dnndeveloper

+0

ResolveAll olduğunu biliyordum, doh! – Aliostad

+0

Sanırım herşeyi kurucumda nasıl çözerim? ya da bu bir özellik bağımlılığı yapmak ve bir şekilde bu şekilde bir çözüm yapmak zorunda kalacağım bir şey. Teşekkürler! – dnndeveloper

10

Konteynere parametre olarak sahip olmanız, beton türlerini yukarıda belirtilen adlarla kaydettirmeniz gerekmez, daha sonra yapıcıda parametre olarak bir dizi eklenir, IList veya jenerik Enum çalışmaz.

public MyConstructor(IMyType[] myTypes) 
+0

Sadece bunu kontrol ettim - tüm kayıtlı IMyType türleri düzgün bir şekilde –

+0

dizisine eklendiğinde bunu buldum Yönetmek için çok daha kolay yaklaşıyor. Kapsayıcınızda yapmanız gereken tek şey 'Container.RegisterType , IMyType []>()' Eklemelerinizin bir DI framework kullandığınızı bilmesine gerek yoktur. belirli bir DI çerçevesinin detaylarına maruz kalmaktadır. – kiprainey

+0

Evet, alan sınıflarından DI'ye bağımlılık yapmak bir antipatterndir. Bu yüzden bu daha iyi bir alternatif – Anders

İlgili konular