Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ninject在使用NinjectHttpModule时创建额外实例_C#_Asp.net Mvc_Ninject - Fatal编程技术网

C# Ninject在使用NinjectHttpModule时创建额外实例

C# Ninject在使用NinjectHttpModule时创建额外实例,c#,asp.net-mvc,ninject,C#,Asp.net Mvc,Ninject,出于某种原因,当我在MVC4应用程序中使用NinjectHttpModule时,Ninject正在创建我的对象的附加实例 如果我使用NinjectHttpModule(Ninject.MVC3默认值),但实际上没有任何需要构造函数注入的IHttpModule类,那么它可以正常工作。但当我创建一个实现IHttpModule并需要构造函数注入的类时,出于某种原因,Ninject就会创建我的对象的两个实例 我向被复制的类添加了一些跟踪代码,以验证它是否被复制。每次创建实例时,静态计数变量都会递增: n

出于某种原因,当我在MVC4应用程序中使用
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
的构造函数中,会发生什么情况?