繁体   English   中英

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

[英]NInject contextual binding When method is called too many times

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方法将它们绑定 ,该方法return true ,并且在调用时还将“测试”消息输出到控制台。 我以为When()每个Get<>() When()只会被调用一次,并期望它仅输出一次“测试”,但是魔术地(或不是吗?^ _ ^) 它将输出3次“测试”

test
test
test

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

为什么会发生? 我们将对每个绑定进行一些非平凡(也很费时间)的检查,但是调用它三次而不是一次将是一个问题。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM