2013-02-27 4 views
1

Я пытаюсь зарегистрировать зависимость с помощью единства и передать значения в конструктор, используя код нижеЕдинство InjectionConstructor массив Передача объекта

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(new InjectionConstructor(new Pharmacy {SiteId = 2,DistrictCode = "2"})); 

, но я получаю

«Тип OrderService.Business. В MockOrderServiceProviderContext нет конструктора, который принимает параметры (Pharmacy). "

Конструктор.

public MockOrderServiceProviderContext(params object[] objects) 
    { 
     _object = objects; 
    } 

Как передать значения конструктора для массива объектов?

Благодаря

ответ

4

PARAMS ключевого слова синтаксический сахар для передачи массива аргументов.

следующий метод:

public void MyMethod(params object[] args) 
{ 
} 

Может быть использован в обеих из следующих способов с теми же результатами:

MyMethod(new object(), new object()); 
MyMethod(new []{ new object(), new object()); 

Когда Unity ищет конструкторы, он видит, конструктор с одним параметром тип object[]. Таким образом, значение, предоставляемое Unity, должно быть массивом.

InjectionConstructor также использует ключевое слово params, где каждый параметр является значением для перехода к вашему собственному конструктору. Если вы создаете экземпляр InjectionConstructor с массивом, он попытается использовать каждый элемент массива и перенаправить его в конструктор класса.

Чтобы остановить это, мы требуем двух уровней обертывания, один для единства, чтобы обеспечить массив для вашего класса, и один, чтобы InjectionConstructor использовал первый массив в качестве первого и единственного параметра.

Таким образом, вы должны использовать следующее:

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(
    new InjectionConstructor(new [] 
    { 
     new [] 
     { 
      new Pharmacy { SiteId = 2, DistrictCode = "2" } 
     } 
    })); 

Если вы хотите дополнительные элементы должны быть переданы, просто добавить их к внутреннему массиву:

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(
    new InjectionConstructor(new [] 
    { 
     new [] 
     { 
      new Pharmacy { SiteId = 2, DistrictCode = "2" }, 
      new Hospital { SiteId = 5, DistrictCode="2" } 
     } 
    })); 
+0

спасибо за объяснение параметров и инжекционного конструирования – JoR

+0

@JoR Нет проблем, я надеюсь, что это имело смысл. – Lukazoid

+0

Очень полезное объяснение, даже 3 года спустя! – brazilianldsjaguar

-1

Поправьте меня, если я ошибаюсь, но вы не пытаетесь дать с вашим В параметре MockOrderServiceProviderContext, который не является массивом?

В качестве параметра вы указываете new InjectionConstructor(..) или object, если хотите, а не object[].

+0

Вообще-то нет. Идея наличия массива объектов заключается в том, что мы можем передавать несколько объектов.Подобно «новому InjectionConstructor (новая аптека {SiteId = 2, DistrictCode =" 2 "}, новая больница {ID = 1, name =" SSS "}' Спасибо – JoR

+0

@joetjah При регистрации в Unity параметры 'InjectionConstructor' являются используется для определения параметров при вводе значений. 'InjectionConstructor' фактически не используется в качестве значения параметра. – Lukazoid

2

Вот как я заработал.

Вы должны добавить объекты в массив, а затем добавить их в массив контейнера таким образом, что он совпадает с параметром конструктора подписи

var objAr = new object[2]; 
objAr[0] = new Pharmacy { SiteId = 3, DistrictCode = "2" }; 
objAr[1] = new Facility { SiteID = 1, FacilityCode="Facility" }; 

//Add the object array to another container array so that Unity Injection constructor can match the constructor. 
var containerArray = new object[1]; 
containerArray[0] = objAr; 

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(new InjectionConstructor(containerArray)); 
Смежные вопросы