2010-11-17 30 views
9

Làm cách nào để có được sự thống nhất của microsoft để 'xây dựng' một danh sách các lớp cho một loại giao diện nhất định.Unity Resolve Multiple Classes

ví dụ rất đơn giản:

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) 
    } 

Thankyou!

Trả lời

13

Nếu bạn đang sử dụng Unity 2 bạn có thể sử dụng ResolveAll<T>

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

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

Bạn phải đặt tên cho mỗi đăng ký vì ResolveAll sẽ chỉ trả lại tên đăng ký.

+0

Điều này sẽ giải quyết như thế nào trong hàm tạo của tôi? – dnndeveloper

+0

Tôi biết có ResolveAll, doh! – Aliostad

+0

Tôi đoán tôi nên nói Làm thế nào để làm một giải quyết tất cả trong constructor của tôi? hoặc là cái gì đó tôi sẽ phải làm cho một phụ thuộc tài sản và làm một cách giải quyết bằng cách nào đó. Cảm ơn! – dnndeveloper

10

Bạn không cần phải có vùng chứa làm tham số, đăng ký loại bê tông với tên như đã nói ở trên, sau đó trong hàm tạo thêm mảng làm tham số, IList hoặc chung Enum không hoạt động.

public MyConstructor(IMyType[] myTypes) 
+0

Chỉ cần kiểm tra điều này - tất cả các loại IMyType đã đăng ký chính xác được đưa vào mảng –

+0

Tôi đã tìm thấy điều này tiếp cận dễ dàng hơn nhiều để quản lý. Tất cả những gì bạn cần làm trong vùng chứa của mình là thêm 'Container.RegisterType , IMyType []>()' Lớp học của bạn ở hạ lưu không cần biết rằng bạn đang sử dụng khung DI, tiếp xúc với các chi tiết của một khuôn khổ DI cụ thể. – kiprainey

+0

Có để có sự phụ thuộc vào DI từ các lớp miền là một antipattern. Đó là lý do tại sao đây là một lựa chọn tốt hơn nhiều – Anders