Ninject使用NinjectHttpModule创建额外实例
问题描述:
由于某些原因,当我在我的MVC 4应用程序中使用NinjectHttpModule
时,Ninject正在创建对象的其他实例。Ninject使用NinjectHttpModule创建额外实例
如果我使用NinjectHttpModule
(Ninject.MVC3默认值),但实际上没有任何需要构造函数注入的IHttpModule
类,它可以正常工作。但只要我创建了一个实现IHttpModule
的类,并且需要构造函数注入,Ninject出于某种原因创建了两个对象实例。
我向正在复制的类添加了一些跟踪代码,以验证它是否被复制。每一个实例被创建时,静态计数变量增加:
namespace Trigger.Events
{
public class TriggerEventRegistry : ITriggerRegistry
{
private static int count;
public TriggerEventRegistry()
{
TriggerEventRegistry.count++;
}
}
}
这里是我的IHttpModule
:
namespace TriggerDevelopment.ApplicationTriggers
{
public class RegisterTriggerComponentsHttpModule : IHttpModule
{
ITriggerEventRegistry eventRegistry;
public RegisterTriggerComponentsHttpModule(ITriggerEventRegistry eventRegistry)
{
this.eventRegistry = eventRegistry;
}
}
....
}
的时候一个TriggerEventRegistry
注入到我的控制器(在相同的请求), TriggerEventRegistry.count
等于2
。如果我注释掉RegisterTriggerComponentsHttpModule
上的构造函数,则TriggerEventRegistry.count
的值等于1
(因为应该只有一个实例/请求,所以应该这样做)。
这里是绑定代码:
Bind<ITriggerEventRegistry>().To<TriggerEventRegistry>().InRequestScope();
任何帮助将不胜感激!
注意
我还送使用curl以避免多个HTTP请求到我的应用程序的请求由浏览器寻找资产,一个图标或类似的东西制成。仍然没有快乐。
更新
经进一步调查,我也看到了构造函数和RegisterTriggerComponentsHttpModule
的Init
方法被调用了两次。
答
它会调用您的HttpModule多少次有请求。例如,大多数Web浏览器至少提交两个请求,即页面请求和一个favicon请求。尝试添加类似的图像的页面,看看你得到三个请求......
将断点在这条线:'TriggerEventRegistry.count ++;',并确认调用堆栈是什么样子,它是Ninject,负责为两个实例。 –
这两次实例都是由Ninject创建的... StandardProvider.Create – orourkedd
可能重复[HttpModule Init方法被多次调用 - 为什么?](http://*.com/questions/1140915/httpmodule-init-method- is-called-several-times-why) –