Ninject.Web.MVC + MVC3抛出StackOverflowException
我有一个简单的Web应用程序使用ASP.NET MVC3和Ninject.Web.MVC(MVC3版本)。
整个事情工作正常,除了应用程序结束时。 无论什么时候结束,内核都会被释放,如NinjectHttpApplication中的Application_End()所示:
反射器告诉我这一点:
public void Application_End()
{
lock (this)
{
if (kernel != null)
{
kernel.Dispose();
kernel = null;
}
this.OnApplicationStopped();
}
}
会发生什么是我的网络服务器发生StackOverflowException(我尝试了IIS7和VS2010中的内置网络服务器)。 我只能假设这是出错的地方,因为我在应用程序端没有自己编写任何代码。
我发现内核知道如何解决IKernel(它返回内核本身),这可能会导致堆栈溢出? 我可以想象这样的事情发生:
换句话说,内核得到处置,处理它所拥有的所有引用(包括一个自引用),从而导致它自己处理。
这有意义吗?
编辑:
看来问题出在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中的一个错误。
我遇到了同样的问题。
我最终复制了NinjectHttpApplication
的代码,并删除了Application_End
函数中的Kernel.Dispose()
。
public void Application_End()
{
lock (this)
{
if (kernel != null)
{
//kernel.Dispose();
kernel = null;
}
this.OnApplicationStopped();
}
}
这应该可以解决这个错误。 不知道是否有计划的修复程序。
MVC3中存在一个错误。 它已在最新版本中修复,并将成为下周发布的RC2的一部分。 同时从构建服务器http://teamcity.codebetter.com构建
链接地址: http://www.djcxy.com/p/49077.html上一篇: Ninject.Web.MVC + MVC3 throws StackOverflowException
下一篇: Aggregate Root