11

Si tengo una clase con un ctor establecido para multi-inyección de la siguiente manera:Ninject multi-inyección no es tan codicioso como hubiera pensado! ¿Cómo?

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

y los enlaces creados de esta manera:

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

Entonces yo esperaría Shogun a ser construido con tanto armas inyectadas? Pero este no es el caso, solo obtiene la Daga.

Si añado una unión adicional como esto:

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

Entonces Shogun tiene la daga y el Shuriken. WhenInjectedInto<T>() parece que debería limitar el enlace al que se aplica y no afecta a otras vinculaciones. Encuentro este comportamiento muy engañoso.

¿Alguien puede explicar lo que está sucediendo aquí?

+0

Lo siento, pero ¿por qué se puede esperar Shogun (en el primer caso) que se construirá con las dos armas inyectados, cuando explícitamente solicita que se unen IWeapon a Daga, cuando se inyecta en Shogun? – virtualmic

+0

Porque también he pedido que 'IWeapon' se vincule a' Sword'. ¿Por qué vincular 'IWeapon' a' Dagger' en el caso específico evita la unión general? Esto significa que puedo escribir código que hace un enlace específico y romper enlaces más generales hechos en otro lugar. Parece peligroso y contra-intuitivo. –

+1

Pero eso superaría el propósito de 'WhenInjectedInto', ¿no es así? Soy nuevo en ninject, pero por lo que yo entiendo, el propósito de esta característica es tener casos específicos, como usted ha mencionado, manejado. Desea que 'IWeapon' se vincule a' Sword' en general; sin embargo, cuando se inyecta en 'Shogun', quiere que esté ligado a' Dagger'. Si desea que 'Shogun' tenga' Sword' y 'Dagger' inyectados,' WhenInjectedInto' no se debe usar, en mi humilde opinión. – virtualmic

Respuesta

Cuestiones relacionadas