我有一个使用ASP.NET MVC3和Ninject.Web.MVC ( MVC3版本)的简单web应用程序。
除了应用程序结束时,整个过程都很正常。无论何时结束,内核都会被释放,如Application_End()在NinjectHttpApplication中所看到的:
反射器告诉我:
public void Application_End()
{
lock (this)
{
if (kernel != null)
{
kernel.Dispose();
kernel = null;
}
this.OnApplicationStopped();
}
}发生的情况是,我的What服务器使用StackOverflowException (我在VS2010中尝试了IIS7和内置的What服务器)。我只能假设这是它出错的地方,因为我自己还没有在应用程序端编写任何代码。
我发现内核知道如何解析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);这解决了这个问题,但我不确定整个循环dispose缓存问题是否是ninject中的一个bug。
发布于 2010-12-01 17:56:54
我也遇到过同样的问题。
最后,我复制了NinjectHttpApplication的代码,并删除了Application_End函数中的Kernel.Dispose()。
public void Application_End()
{
lock (this)
{
if (kernel != null)
{
//kernel.Dispose();
kernel = null;
}
this.OnApplicationStopped();
}
}这应该可以修复错误。不过,不确定是否有计划的解决办法。
发布于 2010-12-01 23:35:21
MVC3中有一个bug。它在最新的修订版中得到了修正,并将成为下周RC2启动的一部分。同时,从构建服务器http://teamcity.codebetter.com获取构建
https://stackoverflow.com/questions/4327151
复制相似问题