【问题标题】:Unity Resolve Multiple ClassesUnity 解决多个类
【发布时间】:2010-11-17 16:54:46
【问题描述】:

如何让 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)
  }

谢谢!

【问题讨论】:

    标签: c# unity-container strategy-pattern


    【解决方案1】:

    如果您使用的是 Unity 2,则可以使用 ResolveAll&lt;T&gt;

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

    您必须为每个注册命名,因为 ResolveAll 只会返回命名注册。

    【讨论】:

    • 我想我应该说如何在我的构造函数中解析所有内容?或者这是我必须建立一个属性依赖并以某种方式解决所有问题。谢谢!
    • 直接在构造函数中获取它的最简单方法可能是只接受 Container 作为参数并从那里调用 resolve all。
    • 我反对将容器用作构造函数参数——组合根之外的类不应引用容器。有关更多详细信息,请参阅 Mark Seemann 的这篇文章:blog.ploeh.dk/2011/07/28/CompositionRoot
    【解决方案2】:

    你不需要容器作为参数,注册具体类型的名称如上所述,然后在构造函数中添加一个数组作为参数,IList或泛型Enum不起作用。

    public MyConstructor(IMyType[] myTypes)
    

    【讨论】:

    • 刚刚检查过 - 所有注册的 IMyType 类型都正确地实例化到数组中
    • 我发现这种方法更易于管理。您只需在容器中添加 Container.RegisterType&lt;IEnumerable&lt;IMyType&gt;, IMyType[]&gt;() 您的下游类不需要知道您正在使用 DI 框架,更不用说了解特定 DI 框架的细节了。
    • 是的,从域类中依赖 DI 是一种反模式。这就是为什么这是一个更好的选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多