C# Ninject在使用NinjectHttpModule时创建额外实例
出于某种原因,当我在MVC4应用程序中使用C# Ninject在使用NinjectHttpModule时创建额外实例,c#,asp.net-mvc,ninject,C#,Asp.net Mvc,Ninject,出于某种原因,当我在MVC4应用程序中使用NinjectHttpModule时,Ninject正在创建我的对象的附加实例 如果我使用NinjectHttpModule(Ninject.MVC3默认值),但实际上没有任何需要构造函数注入的IHttpModule类,那么它可以正常工作。但当我创建一个实现IHttpModule并需要构造函数注入的类时,出于某种原因,Ninject就会创建我的对象的两个实例 我向被复制的类添加了一些跟踪代码,以验证它是否被复制。每次创建实例时,静态计数变量都会递增: n
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
。如果我在RegisterRiggerComponentsHttpModule
上注释掉构造函数,则TriggerVentRegistry.count
的值等于1
(这是应该的,因为应该只有一个实例/请求)
以下是绑定代码:
Bind<ITriggerEventRegistry>().To<TriggerEventRegistry>().InRequestScope();
Bind().To().InRequestScope();
在此方面的任何帮助都将不胜感激
注意
我甚至使用curl向我的应用程序发出请求,以避免浏览器在查找资产、favicon或类似内容时发出多个HTTP请求。还是没有快乐
更新
经过进一步的调查,我还发现ctor和
RegisterRiggerComponentHttpModule的Init
方法被调用了两次。它将调用您的HttpModule,调用次数与请求次数相同。例如,大多数web浏览器至少提交两个请求,页面请求和favicon请求。尝试向页面添加图像之类的内容,然后查看是否收到三个请求…在这行上放置断点:TriggerEventRegistry.count++
并确认调用堆栈的外观,以及是Ninject负责这两个实例化。这两次实例都是由Ninject…StandardProvider.Create创建的,可能与为System.Web.HttpContext.Current.Request
创建对象id重复,以确保它实际上是一个而不是两个请求。您是否像Ninject文档中描述的那样使用OnePerRequestModule
。我们遇到了一个类似的问题,.InRequestScope
在不使用此模块的情况下表现为瞬态作用域。如果将[Inject]
添加到IHttpModule
的构造函数中,会发生什么情况?