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个))。
为什么会这样?我们将为每个绑定添加一些非平凡(并且耗时)检查,但是将其调用三次而不是一次将是一个问题。
答案 0 :(得分:1)
对于单次激活,Ninject将使用When
中提供的委托来评估是否可以解决您的请求。由于Ninject的内部实现,它可能会多次调用它。其来源是github上提供的Ninject源代码。
它无法知道条件的类型或逻辑是否耗时。
并且作为注释:这是Ninject容器每次激活请求比其他容器慢得多的原因之一。正是因为它支持高级上下文/条件绑定,其中每个激活请求必须根据其上下文进行评估(而不是缓存)。