我真的需要在关闭应用程序时处理 IUnityContainer

Do I really need to dispose IUnityContainer on shutdown of application

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

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

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

我正在考虑简单地永久删除对 Dispose 的调用,但我不确定后果,应用程序关闭是否会不可避免地导致容器被处置?

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

Whosebug 的原因是对 UnityContainer 的 Dispose 的无限递归调用,我认为这是(奇怪的)由自动注册的 IUnityContainer 引起的,它不受我们的代码管理,应该在统一库中处理。我能够简单地通过将 UnityContainer class 的使用替换为派生的 class 来停止无限递归,派生 class 在递归调用中覆盖 Dispose 和 returns:

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;

    }
}