11

如果我有建立多注射这样的构造函数的类:Ninject多注入不像我想象的那么贪婪!怎么来的?

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

并成立了这样的绑定:

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

然后,我会希望有两个构造幕府武器注入?但事实并非如此 - 它只能得到匕首。

如果我添加其他结合这样的:

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

然后幕府得到匕首和飞镖。 WhenInjectedInto<T>()看起来应该只是约束它应用于的绑定,而不会影响其他绑定。我觉得这种行为很具误导性。

有人可以解释这里发生了什么吗?

+0

我很抱歉,但你为什么会想到将军(在第一种情况下),以使用两把武器注入,当你明确地问到IWeapon绑定匕首,当注入构造将军? – virtualmic

+0

因为我也要求'IWeapon'绑定到'Sword'。为什么在特定情况下将'IWeapon'绑定到'Dagger'会阻止一般绑定?这意味着我可以编写代码来制作特定的绑定,并打破其他地方制作的更一般的绑定。这看起来很危险而且反直觉。 –

+1

但是这会打败'WhenInjectedInto'的目的,不是吗?我对ninject很陌生,但据我所知,这个功能的目的是为了处理特定情况,正如你所提到的那样。一般来说,你想'IWeapon'绑定到'Sword';然而,在注入“幕府”时,你希望它被绑定到“匕首”。如果你希望'Shogun'同时注入'Sword'和'Dagger',不应该使用'WhenInjectedInto',恕我直言。 – virtualmic

回答