0
interface IWarrior
{
}

class Samurai : IWarrior
{
}

public class Program
{
    public static void Main(string[] args)
    {
        var kernel = new StandardKernel();

        kernel.Bind<IWarrior>().To<Samurai>().When(i =>
        {
            Console.WriteLine("test");
            return true;
        });

        IWarrior warrior = kernel.Get<IWarrior>();
    }
}

这是一个非常简单的场景,我正在创建虚拟接口 + 实现并使用NInject 的 Contextual BindingWhen方法 which绑定它们return true,并且它还在调用时将“测试”消息输出到控制台。我以为When()每个预期只会被调用一次,Get<>()它只输出一次“test”,但神奇地(或不是?^_^)它输出 3 次“test”

test
test
test

这意味着When()每个Get<>()请求调用 3 次(我添加了 IWarrior 的另一个实现并绑定它,然后输出计数为 6(每个绑定 3 个))。

为什么会这样?我们将对每个绑定进行一些重要(而且也很耗时)的检查,但是将其调用 3 次而不是 1 次将是一个问题。

4

1 回答 1

1

对于单次激活,Ninject 将评估它是否可以使用When. 由于 Ninject 的内部实现,它可能会多次调用它。源代码是 github 上提供的 Ninject 源代码。

它无法知道条件的类型或逻辑是否耗时。

请注意:这是 Ninject 容器在每个激活请求上比其他容器慢得多的原因之一。正是因为它支持高级上下文/条件绑定,其中每个激活请求都必须根据其上下文进行评估(而不是缓存)。

于 2014-10-27T20:27:56.287 回答