Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unity Resolve Multiple Classes

How do I get microsoft unity to 'construct' a list of classes for a given interface type.

Very Simple example:

  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!

like image 354
dnndeveloper Avatar asked Nov 17 '10 16:11

dnndeveloper


2 Answers

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>();

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

like image 174
Stephan Avatar answered Nov 20 '22 12:11

Stephan


You do not need to have the container as parameter, register the concrete types with names as said above, then in the constructor add a array as parameter, IList or generic Enum does not work.

public MyConstructor(IMyType[] myTypes)
like image 22
Anders Avatar answered Nov 20 '22 12:11

Anders