问题 Ninject多次注射并不像我想象的那样贪婪!怎么来的?


如果我有一个ctor设置为多次注入的类,如下所示:

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得到了Dagger和Shuriken。 WhenInjectedInto<T>() 看起来它应该只限制它应用的绑定而不影响其他绑定。我发现这种行为非常误导。

有人能解释一下这里发生了什么吗?


11569
2017-09-04 04:02


起源

对不起,但为什么你会想到Shogun(在第一种情况下)用两种武器注入,当你明确要求将IWeapon绑定到Dagger时,注入Shogun? - virtualmic
因为我也要求了 IWeapon 被束缚 Sword。为什么要绑定 IWeapon 至 Dagger 在具体情况下防止一般约束?这意味着我可以编写代码来创建特定的绑定并打破在其他地方创建的更通用的绑定。这似乎很危险,反直觉。 - James World
但这会击败目的 WhenInjectedInto不是吗?我是ninject的新手,但据我了解,此功能的目的是让您处理具体案例,如您所述。你要 IWeapon 被束缚 Sword 一般来说;然而,注入时 Shogun,你希望它被绑定 Dagger。如果你想 Shogun 两者都有 Sword 和 Dagger 注入, WhenInjectedInto 不应该使用,恕我直言。 - virtualmic
虽然我们从事免责声明,但我也是Ninject的新手。 :)我看到你在说什么,这可能只是一个意见问题 - 我认为WhenInjectedInto的阅读有点暧昧。我正在阅读它作为参考实施(即 Dagger 要么 Sword)而不是合同(即 IWeapon),而不是说“当注入IWeapon到Shogun注入匕首”。阅读这种方式是有道理的。 - James World
我仍然不喜欢通用绑定然后丢弃的方式。 :)我忍不住看到它可能在复杂的应用程序中以意想不到的方式破坏事物。 - James World


答案:


这是一个错误 - 如果条件和无条件绑定混合,GetAll将不会返回所有实例

它已在版本中修复 版本2.4.0.0


13
2017-09-04 22:21



+1快速周转! - Jason Turan
所以我错了! (在对问题的评论中)。谢谢你的问题,詹姆斯和澄清,雷莫! - virtualmic
不错的工作!我松了一口气这是一个错误,而不是设计! - James World
只是补充一点,在撰写本文时,当前版本的版本是2.2.0.0 - 因此受此影响的任何人都需要刻意抓住最新版本。 - James World