Unity解析多个类

dnn*_*per 9 c# unity-container strategy-pattern

我如何获得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)
  }
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ste*_*han 13

If you are using Unity 2 you can use ResolveAll<T>

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

IEnumerable<IShippingInfo> infos = Container.ResolveAll<IShippingInfo>();
Run Code Online (Sandbox Code Playgroud)

You have to give a name to every registration because ResolveAll will only return named registrations.

  • 我反对使用容器作为构造函数参数 - 组合根之外的类不应该引用容器.有关更多详细信息,请参阅Mark Seemann的这篇文章:http://blog.ploeh.dk/2011/07/28/CompositionRoot/ (4认同)

And*_*ers 11

您不需要将容器作为参数,使用如上所述的名称注册具体类型,然后在构造函数中添加数组作为参数,IList或通用枚举不起作用.

public MyConstructor(IMyType[] myTypes)
Run Code Online (Sandbox Code Playgroud)