【问题标题】:Why ninject injects a null where it could inject an empty enumerable?为什么 ninject 在它可以注入一个空的可枚举的地方注入一个空值?
【发布时间】:2023-12-02 06:27:01
【问题描述】:

我有以下定义。

interface IWeapon {}

class Warrior
{
 [Inject]
 public IEnumerable<IWeapon> Weapons { get; private set; }
}

如果我调用new StandardKernel().GetAll&lt;IRule&gt;(),它可以理解地返回一个空的枚举。

现在,如果我调用new StandardKernel().Get&lt;Engine&gt;(),返回的战士在Weapons 属性中有一个null。不应该注入一个空的枚举吗?


次要问题。我修改了Warrior 类如下。

class Warrior
{
    public IEnumerable<IWeapon> Weapons { get; private set; }

 public Warrior(IEnumerable<IWeapon> weapons)
 { this.Weapons = weapons; }
}

这一次,如果我调用new StandardKernel().Get&lt;Engine&gt;() Ninject 将抛出一个 ActivationException 说“没有匹配的绑定可用”。同样,我期待它只是发送一个空的枚举。

那么,这种行为真的是设计所期望的还是这里有错误?如果是设计使然,是否有任何解决方法?

【问题讨论】:

    标签: .net collections ienumerable ninject


    【解决方案1】:

    我今天和 Ian 讨论了这个和构造函数评分。我们都同意我们应该改变这一点。请耐心等待,直到我们实现它。

    【讨论】:

    • 没有什么能比直接从作者那里得到答案。那我就等改代码了。或者我会尝试自己实现它。 :)
    • 添加到最新版本。将成为即将到来的 RC2 的一部分。