[英]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 Binding和When
方法将它们绑定 ,该方法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.