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?
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
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ą. –
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