我有一个使用 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();
}
}
发生的事情是我的网络服务器因 StackOverflowException 而崩溃(我尝试了 IIS7 和 VS2010 中的内置网络服务器)。我只能假设这是问题所在,因为我自己没有在应用程序端编写任何代码。
我发现内核知道如何解析 IKernel(它返回内核本身),这可能会导致堆栈溢出吗?我可以想象会发生这样的事情:
- Kernel.Dispose()
- 释放内核中的所有实例
- 嘿!看看这个,内核也在内核中。返回步骤 1。
换句话说,内核被处置,处置它持有的所有引用(包括自引用),这导致它处置自己。
这有什么意义吗?
编辑:
看来问题出在 NinjectHttpApplication 中。看看这个激活码:
public void Application_Start()
{
lock (this)
{
kernel = this.CreateKernel();
...
kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();
...
}
}
看起来没问题,但现在发生的情况是,每当调用 IResolutionRoot 时,内核都会缓存在其自身中。释放内核时清空缓存,释放所有缓存的对象,造成循环引用。
NinjectHttpApplication 的一个简单解决方案是简单地更改绑定(bind)。将常量绑定(bind)更改为方法一:
kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();
成为
kernel.Bind<IResolutionRoot>().ToMethod(x => this.Kernel);
这解决了问题,但我不确定整个循环处理缓存问题是否是 ninject 中的错误。
最佳答案
我遇到了同样的问题。
我最终复制了 NinjectHttpApplication
的代码并删除了 Application_End
函数中的 Kernel.Dispose()
。
public void Application_End()
{
lock (this)
{
if (kernel != null)
{
//kernel.Dispose();
kernel = null;
}
this.OnApplicationStopped();
}
}
这应该可以修复错误。不过不确定是否有针对它的计划修复。
关于c# - Ninject.Web.MVC + MVC3 抛出 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4327151/