2016-01-08 3 views
2

Я хочу добавить коллекцию элементов конфигурации в конструкторы через Unity.Устранение и регистрация массива элементов в Unity

Вот пример, иллюстрирующий то, что я в настоящее время есть, что не удается вставить массив я надеялся в мой конструктор:

class ArgumentType 
{ 
    public ArgumentType(string p1) { _p1 = p1; } 
    private string _p1; 
    public string P1 { get { return _p1; } } 
} 

class ConsumingType : IConsumingType /* interface omitted here */ 
{ 
    public ConsumingType(ArgumentType[] myArguments) 
    { 
     ... 
    } 
} 

class Application 
{ 
    private UnityContainer _container; 
    public static void Main() 
    { 
     _container = new UnityContainer() 
     _container.RegisterType<ArgumentType[]>(new InjectionFactory(c => { 
      return new ArgumentType[] { 
       new ArgumentType("Foo"), 
       new ArgumentType("Bar"), 
       new ArgumentType("Baz") };)); 
     _container.RegisterType<IConsumingType, ConsumingType>(); 

     var myUsefulThing = _container.Resolve<IConsumingType>(); 
     /* Do useful stuff */ 
    } 
} 

Все ответы я нахожу для поисковых терминов, как «Инъекция массив объектов с использованием Unity "находят примеры, когда Unity возвращает массив из различных реализаций интерфейса, например Injecting arrays with Unity

Я знаю, что есть нагрузки примеров на сайте MSDN (например https://msdn.microsoft.com/en-us/library/ff660882(v=pandp.20).aspx#config_array_runtime), но я ничего такого, что действительно покрывает мой случай использования не найти. Я также хочу сделать это только в коде (не в app.config).

Очевидным обходным решением, если это не удается, является создание типа для хранения моего массива - это было бы достаточно простым решением, но я уверен, что это должно быть возможно с InjectionFactory или InjectionConstructor, или один из их братья и сестры.

ответ

1

Я думаю, что вы можете зарегистрировать ArgumentTypes непосредственно в Unity, а не путем регистрации и массива с экземплярами. Но вам нужно использовать имя для каждого параметра ArgumentType.

При разрешении вашего единства ConsumingType достаточно умен, чтобы внедрить все зарегистрированные ArgumentTypes в виде массива.

_container.RegisterInstance<ArgumentType>("Foo", new ArgumentType("Foo")); 
_container.RegisterInstance<ArgumentType>("Bar", new ArgumentType("Bar")); 
_container.RegisterInstance<ArgumentType>("Baz", new ArgumentType("Baz")); 
_container.RegisterType<IConsumingType, ConsumingType>(); 

var myUsefulThing = _container.Resolve<IConsumingType>(); 
+0

Хорошо, у этого есть заслуга. Но компилятор не может преобразовать 'ArgumentType' в параметр' InjectionMember', необходимый для этой перегрузки 'RegisterInstance'. Должен ли объект ArgumentType быть завернут в «InjectionConstructor» или аналогичный? – CJBrew

+0

На самом деле это именно то, что нужно. '_container.RegisterInstance ("Foo", новый InjectionConstructor ("Foo"));' не Если он работает на моем коде приложения реальной жизни, вы получите зеленый тик :) – CJBrew

+0

@CJBrew RegisterInstance не нуждается для InjectionMember вы регистрируете экземпляры. Я думаю, вы смешиваете это с RegisterType. Но вы также можете использовать RegisterType («Foo», новый InjectionConstructor («Foo»)); – Jehof

Смежные вопросы