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" }
}
}));
спасибо за объяснение параметров и инжекционного конструирования – JoR
@JoR Нет проблем, я надеюсь, что это имело смысл. – Lukazoid
Очень полезное объяснение, даже 3 года спустя! – brazilianldsjaguar