2010-11-17 55 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

相关问题