Ninject.Web.MVC + MVC3抛出StackOverflowException

时间:2010-12-01 17:30:40

标签: c# asp.net-mvc ninject asp.net-mvc-3

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

除了应用程序结束时,整个过程正常。每当它结束时,就会释放内核,如NinjectHttpApplication中的Application_End()所示:

Reflector告诉我:

public void Application_End()
{
    lock (this)
    {
        if (kernel != null)
        {
            kernel.Dispose();
            kernel = null;
        }
        this.OnApplicationStopped();
    }
}

我的网络服务器因StackOverflowException而崩溃(我在VS2010中尝试了IIS7和内置的网络服务器)。我只能假设这是出错的地方,因为我自己没有在应用程序端编写任何代码。

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

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

换句话说,内核被释放,处置它所拥有的所有引用(包括自引用),这会导致它自行处理。

这有意义吗?

编辑:

似乎问题出在NinjectHttpApplication中。看看这个激活码:

    public void Application_Start()
    {
        lock (this)
        {
            kernel = this.CreateKernel();
            ...
            kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();
            ...
        }
    }

看起来没问题,但现在发生的事情是,每当调用IResolutionRoot时,内核都会缓存在自身内部。在处理内核时,清空缓存会释放所有缓存的对象,这会导致循环引用。

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

kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();

变为

kernel.Bind<IResolutionRoot>().ToMethod(x => this.Kernel);

这解决了这个问题,但我不确定整个循环处理缓存问题是否是ninject中的错误。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。

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

public void Application_End()
{
    lock (this)
    {
        if (kernel != null)
        {
            //kernel.Dispose();
            kernel = null;
        }
        this.OnApplicationStopped();
    }
}

这应该可以解决错误。不确定是否有针对它的计划修复。

答案 1 :(得分:2)

MVC3中存在错误。它已在最新版本中修复,并将成为下周RC2的一部分。同时从构建服务器http://teamcity.codebetter.com

获取构建