Ninject的多重注入并不像我想象的那样贪心!为什么?

11

如果我有一个设置为多重注入的构造函数的类,就像这样:

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

并且绑定设置如下:

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

那么我会期望Shogun使用两个武器进行构造,但事实并非如此——它只获得了Dagger。

如果我添加一个额外的绑定,像这样:

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

然后Shogun获得匕首和手里剑。WhenInjectedInto<T>()似乎只应该约束应用它的绑定而不影响其他绑定,但实际上并非如此。我发现这种行为非常令人误解。

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


很抱歉,但是为什么你会期望在第一种情况下Shogun被构造时注入两个武器,当你明确要求将IWeapon绑定到Dagger并注入到Shogun中呢? - virtualmic
1
但这样做会打破WhenInjectedInto的目的,不是吗?我对ninject还很陌生,但据我所知,此功能的目的是处理特定情况,正如您所提到的。您希望将IWeapon通常绑定到Sword;然而,当注入到Shogun中时,您希望它绑定到Dagger。如果您希望Shogun同时注入SwordDagger,则不应使用WhenInjectedInto,在我看来。 - virtualmic
在我们进行免责声明的同时,我也是 Ninject 的新手。:) 我明白你的意思,这可能只是一个观点问题——我认为 WhenInjectedInto 的解读有些模糊。我一直将其解读为针对实现(即DaggerSword)而非契约(即IWeapon),而不是说“当将 IWeapon 注入 Shogun 时注入 Dagger”。以这种方式阅读它是有道理的。 - James World
我仍然不喜欢一般绑定被取消的方式。 :) 我忍不住看到它在复杂应用程序中可能以意想不到的方式破坏事情。 - James World
我认为我想看到一个解释具体机制的答案。我注意到其他When条件可以应用并且似乎可以与我已经有的条件相结合,例如: Bind<IWeapon>().To<BoStaff>().When(x => true);这里根本没有提到“Shogun”,但仍然出现在多重注入中,而“Sword”则没有出现。 - James World
显示剩余2条评论
1个回答

13

1
所以我错了!(在评论中对问题)。感谢问题,James和澄清,Remo! - virtualmic
干得好!我松了一口气,原来是个bug,而不是设计问题! - James World
仅补充一点,在撰写本文时,当前发布版本为2.2.0.0 - 因此任何受此影响的人都需要有意识地获取最新版本。 - James World

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接