Unity Resolve нескольких классов - PullRequest
9 голосов
/ 17 ноября 2010

Как мне получить 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)
  }

Thankyou!

Ответы [ 2 ]

13 голосов
/ 17 ноября 2010

Если вы используете 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 будет возвращать только именованные регистрации.

11 голосов
/ 09 февраля 2011

Вам не нужно иметь контейнер в качестве параметра, зарегистрировать конкретные типы с именами, как указано выше, затем в конструктор добавить массив в качестве параметра, IList или универсальный Enum не работает.

public MyConstructor(IMyType[] myTypes)
...