Ninject 在使用 NinjectHttpModule 时创建一个额外的实例
Posted
技术标签:
【中文标题】Ninject 在使用 NinjectHttpModule 时创建一个额外的实例【英文标题】:Ninject Creating an Extra Instance when using NinjectHttpModule 【发布时间】:2013-03-20 22:24:07 【问题描述】:由于某种原因,当我在 MVC 4 应用程序中使用 NinjectHttpModule
时,Ninject 正在创建我的对象的另一个实例。
如果我使用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
的 ctor 和 Init
方法被调用了两次。
【问题讨论】:
在这一行设置一个断点:TriggerEventRegistry.count++;
并确认调用堆栈是什么样的,并且是 Ninject 负责这两个实例化。
实例都是由 Ninject 创建的...StandardProvider.Create
HttpModule Init method is called several times - why?的可能重复
如何为System.Web.HttpContext.Current.Request
创建一个对象ID 以确保它确实是一个请求而不是两个请求。您是否像 Ninject 文档中描述的那样使用 OnePerRequestModule
。我们遇到了类似的问题,.InRequestScope
在不使用此模块的情况下表现得像瞬态作用域。
如果将[Inject]
添加到IHttpModule
的构造函数中会发生什么?
【参考方案1】:
它将调用您的 HttpModule 的次数与请求的次数一样多。例如,大多数网络浏览器至少提交两个请求,页面请求和网站图标请求。尝试在页面中添加图片之类的内容,看看是否收到三个请求...
【讨论】:
以上是关于Ninject 在使用 NinjectHttpModule 时创建一个额外的实例的主要内容,如果未能解决你的问题,请参考以下文章