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 时创建一个额外的实例的主要内容,如果未能解决你的问题,请参考以下文章

在构造函数中使用带有附加参数的 Ninject 创建实例

如何在Ninject中使用AutoMApper.5.2.0?

使用 Ninject.MVC3 在测试项目中添加绑定

Ninject之旅之七:Ninject依赖注入

如何在c#类库中使用Ninject

NInject在函数中使用