我是否真的需要在关闭应用程序时处置IUnityContainer

时间:2015-09-22 14:49:30

标签: asp.net-mvc unity-container stack-overflow

我正在维护使用Asp.NET MVC构建的Web应用程序的代码。使用Unity容器实现了MVC依赖性解析器。这是在应用程序关闭时调用的清理代码。

 public static void Shutdown()
 {            
        IUnityContainer container = UnityConfig.GetConfiguredContainer();
        container.Dispose(); //currently when called causes stack overflow            
 }

我们遇到的问题是,在关闭期间,对dispose(上面)的调用会导致堆栈溢出异常,然后进程因此崩溃。在开发期间调试应用程序并对web.config进行更改时也会发生这种情况(因为对web.config的更改似乎会重新启动应用程序),这也会停止通常不应该结束的调试会话。如果我删除对dispose的调用,似乎不会发生堆栈溢出,然后应用程序会在调试会话期间正常退出或重新启动而不会导致进程崩溃。

我想简单地永久删除对Dispose的调用,但我不确定后果,关闭应用程序不会导致无论如何都会导致处理容器吗?

如果不建议删除对dispose的调用,那么唯一的选择是找到我认为存在于容器本身的循环依赖中的真正原因,但是我找不到它,我应该如何调试这个问题?

1 个答案:

答案 0 :(得分:1)

stackoverflow的原因是对Dispose of UnityContainer的无限递归调用,我认为(奇怪)是由自动注册的IUnityContainer引起的,它不是由我们的代码管理的,应该在Unity库中处理。我能够通过更换UnityContainer类的用法来停止无限递归,该派生类覆盖Dispose并在递归调用时返回:

public class CustomUnityContainer : UnityContainer
{

    private bool inDispose = false;

    protected override void Dispose(bool disposing)
    {
        if (inDispose) //prevents recursive calls into Dispose
            return;

        inDispose = true;

        base.Dispose(disposing);

        inDispose = false;

    }
}