11

Если у меня есть класс с CTOR создан для нескольких инъекций, как это:Ninject multi-injection не так жадна, как я бы подумал! Как так?

public Shogun(IEnumerable<IWeapon> allWeapons) 
{ 
    this.allWeapons = allWeapons; 
} 

И привязок созданы так:

Bind<IWeapon>().To<Sword>(); 
Bind<IWeapon>().To<Dagger>().WhenInjectedInto<Shogun>(); 

Тогда я ожидал бы Shogun быть построены как с введенное оружие? Но это не тот случай - он получает только Кинжал.

Если добавить еще связывании так:

Bind<IWeapon>().To<Sword>(); 
Bind<IWeapon>().To<Dagger>().WhenInjectedInto<Shogun>(); 
Bind<IWeapon>().To<Shuriken>().WhenInjectedInto<Shogun>(); 

Затем Shogun получает Кинжал и Shuriken. WhenInjectedInto<T>() похоже, что это должно ограничивать привязку, к которой она применяется, и не влиять на другие привязки. Я считаю, что это поведение очень вводит в заблуждение.

Может кто-нибудь объяснить, что здесь происходит?

+0

Я извиняюсь, но почему вы ожидали бы Shogun (в первом случае), который будет построен с впрыскивается как оружие, когда вы явно просят связать IWeapon с кинжалом, при введении в Shogun? – virtualmic

+0

Потому что я также попросил 'IWeapon' привязаться к' Sword'. Почему привязка 'IWeapon' к' Dagger' в конкретном случае предотвращает общую привязку? Это означает, что я могу написать код, который создает специфическое связывание и разбивает более общие привязки, сделанные в другом месте. Это кажется опасным и противоречивым. –

+1

Но это побьет цель «WhenInjectedInto», не так ли? Я новичок в ninject, но, насколько я понимаю, цель этой функции - иметь конкретные случаи, как вы уже упоминали, обрабатывать. Вы хотите, чтобы «IWeapon» привязывался к «Sword» вообще; однако при введении в «Сёгун» вы хотите, чтобы он был связан с «Кинжалом». Если вы хотите, чтобы «Shogun» вводил как «Sword», так и «Dagger», «WhenInjectedInto» не должен использоваться, IMHO. – virtualmic

ответ

13
+0

+1 для быстрого поворота! –

+1

Так что я был неправ! (в комментариях к вопросу). Спасибо за вопрос, Джеймс и разъяснения, Ремо! – virtualmic

+0

Хорошая работа! Я рад, что это была ошибка, а не дизайн! –