2013-03-30 74 views
5

由于某些原因,当我在我的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请求到我的应用程序的请求由浏览器寻找资产,一个图标或类似的东西制成。仍然没有快乐。

更新

经进一步调查,我也看到了构造函数和RegisterTriggerComponentsHttpModuleInit方法被调用了两次。

+1

将断点在这条线:'TriggerEventRegistry.count ++;',并确认调用堆栈是什么样子,它是Ninject,负责为两个实例。 –

+0

这两次实例都是由Ninject创建的... StandardProvider.Create – orourkedd

+0

可能重复[HttpModule Init方法被多次调用 - 为什么?](http://stackoverflow.com/questions/1140915/httpmodule-init-method- is-called-several-times-why) –

回答

0

它会调用您的HttpModule多少次有请求。例如,大多数Web浏览器至少提交两个请求,即页面请求和一个favicon请求。尝试添加类似的图像的页面,看看你得到三个请求......