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(它返回内核本身),这可能会导致堆栈溢出? 我可以想象这样的事情发生:

  • Kernel.Dispose()
  • 处理内核中的所有实例
  • 嘿! 看看这个,内核也在内核中。 返回到第1步。
  • 换句话说,内核得到处置,处理它所拥有的所有引用(包括一个自引用),从而导致它自己处理。

    这有意义吗?

    编辑:

    看来问题出在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