2010-11-17 98 views
9

如何獲得microsoft unity以構建給定接口類型的類列表。統一解決多個類

很簡單的例子:

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

三江源!

回答

13

如果您在使用Unity 2,你可以使用ResolveAll<T>

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

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

你必須給一個名稱,每個註冊,因爲ResolveAll只會返回命名註冊。

+0

這將如何解決我的構造函數? – dnndeveloper 2010-11-17 17:21:49

+0

我知道有ResolveAll,doh! – Aliostad 2010-11-17 17:23:08

+0

我想我應該說我如何在我的構造函數中解決所有問題?或者這是我必須做出財產依賴並以某種方式做出決定的方式。謝謝! – dnndeveloper 2010-11-17 17:49:36

10

您不需要將容器作爲參數,如上所述註冊具體類型的名稱,然後在構造函數中添加一個數組作爲參數,IList或泛型Enum不起作用。

public MyConstructor(IMyType[] myTypes) 
+0

剛剛檢查了這一點 - 所有註冊IMyType類型正確得到實例化到數組 – 2012-09-12 07:29:14

+0

我已經找到這個方法更容易管理。所有你需要在你的容器中做的是添加 'Container.RegisterType ,IMyType []>()' 您的類下游並不需要知道您正在使用DI框架,更不用說了暴露於特定DI框架的細節。 – kiprainey 2013-10-23 14:35:24

+0

是從域類對DI有依賴是一個反模式。這就是爲什麼這是一個更好的選擇 – Anders 2013-10-23 14:37:40