我有一个使用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(它返回内核本身),这可能会导致堆栈溢出吗?我可以想象会发生这样的事情:
换句话说,内核被释放,处置它所拥有的所有引用(包括自引用),这会导致它自行处理。
这有意义吗?
似乎问题出在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中的错误。
答案 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
获取构建