首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ninject.Web.MVC + MVC3抛出StackOverflowException

Ninject.Web.MVC + MVC3抛出StackOverflowException
EN

Stack Overflow用户
提问于 2010-12-01 17:30:40
回答 2查看 1.4K关注 0票数 7

我有一个使用ASP.NET MVC3和Ninject.Web.MVC ( MVC3版本)的简单web应用程序。

除了应用程序结束时,整个过程都很正常。无论何时结束,内核都会被释放,如Application_End()在NinjectHttpApplication中所看到的:

反射器告诉我:

代码语言:javascript
复制
public void Application_End()
{
    lock (this)
    {
        if (kernel != null)
        {
            kernel.Dispose();
            kernel = null;
        }
        this.OnApplicationStopped();
    }
}

发生的情况是,我的What服务器使用StackOverflowException (我在VS2010中尝试了IIS7和内置的What服务器)。我只能假设这是它出错的地方,因为我自己还没有在应用程序端编写任何代码。

我发现内核知道如何解析IKernel (它返回内核本身),这可能会导致堆栈溢出吗?我可以想象会发生这样的事情:

  • Kernel.Dispose()
  • Dispose内核中的所有实例
  • 嘿!看看这个,内核也在内核中。返回步骤1.

换句话说,内核被释放,处理它所持有的所有引用(其中包括一个自引用),从而使它自行处理。

这说得通吗?

编辑:

看起来问题就在NinjectHttpApplication里。看看这个激活代码:

代码语言:javascript
复制
    public void Application_Start()
    {
        lock (this)
        {
            kernel = this.CreateKernel();
            ...
            kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();
            ...
        }
    }

看起来不错,但现在发生的情况是,每当调用IResolutionRoot时,内核就会缓存在自己的内部。在配置内核时,缓存将被清空,这将释放所有缓存对象,这将导致循环引用。

NinjectHttpApplication的一个简单解决方案是简单地更改绑定。将常量绑定更改为方法一:

代码语言:javascript
复制
kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();

变成了

代码语言:javascript
复制
kernel.Bind<IResolutionRoot>().ToMethod(x => this.Kernel);

这解决了这个问题,但我不确定整个循环dispose缓存问题是否是ninject中的一个bug。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-01 17:56:54

我也遇到过同样的问题。

最后,我复制了NinjectHttpApplication的代码,并删除了Application_End函数中的Kernel.Dispose()

代码语言:javascript
复制
public void Application_End()
{
    lock (this)
    {
        if (kernel != null)
        {
            //kernel.Dispose();
            kernel = null;
        }
        this.OnApplicationStopped();
    }
}

这应该可以修复错误。不过,不确定是否有计划的解决办法。

票数 2
EN

Stack Overflow用户

发布于 2010-12-01 23:35:21

MVC3中有一个bug。它在最新的修订版中得到了修正,并将成为下周RC2启动的一部分。同时,从构建服务器http://teamcity.codebetter.com获取构建

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4327151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档