11

Jeśli mam klasę z ctor utworzonej w wielu zastrzyku tak:Ninject multi-injection nie jest tak chciwy, jak bym pomyślał! Dlaczego?

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

i wiązania utworzone tak:

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

Potem spodziewałbym Shogun zostać skonstruowana z zarówno broń wstrzyknięta? Ale tak nie jest - dostaje tylko Sztylet.

Jeśli dodać dalsze wiązanie tak:

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

Wtedy Shogun dostaje sztylet i Shuriken. WhenInjectedInto<T>() wygląda na to, że powinno ograniczać wiązanie, które jest stosowane i nie wpływa na inne powiązania. Uważam to zachowanie za bardzo mylące.

Czy ktoś może wyjaśnić, co się tutaj dzieje?

+0

przykro mi, ale dlaczego można oczekiwać Shogun (w pierwszym przypadku) być zbudowane z obu broni wtryskiwana, gdy wyraźnie prosi związać IWeapon do Dagger, po wstrzyknięciu Shogun? – virtualmic

+0

Ponieważ poprosiłem również, aby 'IWeapon' był związany z' Sword'. Dlaczego wiązanie 'IWeapon' do' Dagger' w konkretnym przypadku zapobiega ogólnym wiązaniom? Oznacza to, że mogę napisać kod, który tworzy specyficzne wiązanie i łamać bardziej ogólne powiązania wykonane gdzie indziej. Wydaje się to niebezpieczne i sprzeczne z intuicją. –

+1

Ale to mogłoby pokonać cel "WhenInjectedInto", prawda? Jestem nowicjuszem, ale o ile rozumiem, celem tej funkcji jest posiadanie konkretnych przypadków, o których już wspomniałeś. Chcesz, aby 'IWeapon' był związany z' Sword' w ogóle; jednak, gdy zostanie wstrzyknięty do 'Shogun', chcesz, aby był związany z' Dagger'. Jeśli chcesz, aby 'Shogun' miał wstrzykiwany' Sword' and 'Dagger',' WhenInjectedInto' nie powinien być używany, IMHO. – virtualmic

Odpowiedz

Powiązane problemy