c# - Unity 中的递归和 Dispose 模式实现

标签 c# .net unity-container enterprise-library dispose

我的类继承自UnityContainer(来自Unity 2.0),这里是源代码:

    public class UnityManager : UnityContainer
    {

        private UnityManager()
        {
            _context = new MyDataClassesDataContext();
            // ...
        }


        protected override void Dispose(bool disposing)
        {
            if ( disposing )
            {
                _context.Dispose();
            }

            base.Dispose(disposing);
        }

        private readonly CMCoreDataClassesDataContext _context;
    }

当为 UnityManager 类的实例调用 Dispose 方法时,它会进入递归...为什么?据我所知 base.Dispose 应该只调用基类的 Dispose 方法......不是吗?谁回调UnityManager的Dispose(bool)?如何防止这种情况?

谢谢。

最佳答案

多亏了 Nicole,我找到了一个理由……谢谢。 但是在这种情况下如何处理容器呢?如果为 UnityManager 的实例调用“Dispose”,base.Dispose(true) 将再次调用 Dispose.... 并再次(递归将开始)。

为了解决这个问题,我添加了额外的私有(private)变量 bool _bDisposed:

    protected override void Dispose(bool disposing)
    {
        if (_bDisposed)
            return;

        if ( disposing )
        {
            _context.Dispose();
        }
        _bDisposed = true;

        base.Dispose(disposing);
    }

    private bool _bDisposed;

这是 Bill Wagner 在“Effective C#”中建议的“Dispose”模式实现(如果我没记错的话)

关于c# - Unity 中的递归和 Dispose 模式实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2959485/

相关文章:

c# - 为什么 XmlDocument Validate 事件处理程序没有被命中?

c# - 比较 7 个单词,看看其中 5 个是否相等。如何?

c# - C#回到程序的开头

.net - Jenkins + SVN + .NET 项目 + 代码审查。最好的方法是这样做吗?

c# - 是否可以统一删除重复注册?

c# - 将单例注册为 Prism 7 的接口(interface)集合

c# - 单击以在 C# 中打开托盘图标的菜单

.net - 如何保护我的 .NET 应用程序免受 DLL 劫持?

c# - Winforms清除位图图像?

configuration - 如何将统一配置部分分成几个文件?