NInject上下文绑定当方法被调用太多次时

时间:2014-10-27 17:19:46

标签: c# dependency-injection ninject inversion-of-control contextual-binding

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&#39; Contextual Binding When方法绑定它们{{ 1}},它还输出&#34; test&#34;调用时向控制台发送消息。我认为return true只会在When()期间被调用一次,期望它输出&#34; test&#34;只有一次,但神奇地(或不是?^ _ ^)它输出3次&#34;测试&#34;

Get<>()

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

为什么会这样?我们将为每个绑定添加一些非平凡(并且耗时)检查,但是将其调用三次而不是一次将是一个问题。

1 个答案:

答案 0 :(得分:1)

对于单次激活,Ninject将使用When中提供的委托来评估是否可以解决您的请求。由于Ninject的内部实现,它可能会多次调用它。其来源是github上提供的Ninject源代码。

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

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