Ninject.Web.MVC + MVC3抛出StackOverflowException

Eri*_*kel 7 c# asp.net-mvc ninject asp.net-mvc-3

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

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

反射器告诉我这个:

public void Application_End()
{
    lock (this)
    {
        if (kernel != null)
        {
            kernel.Dispose();
            kernel = null;
        }
        this.OnApplicationStopped();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

这有意义吗?

编辑:

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

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

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

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

kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();
Run Code Online (Sandbox Code Playgroud)

kernel.Bind<IResolutionRoot>().ToMethod(x => this.Kernel);
Run Code Online (Sandbox Code Playgroud)

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

Oma*_*mar 2

我遇到了同样的问题。

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

public void Application_End()
{
    lock (this)
    {
        if (kernel != null)
        {
            //kernel.Dispose();
            kernel = null;
        }
        this.OnApplicationStopped();
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该可以修复错误。但不确定是否有计划修复它。