代码之家  ›  专栏  ›  技术社区  ›  Budda

统一中的递归和释放模式实现

  •  2
  • Budda  · 技术社区  · 15 年前

    我的类继承自UnityContainer(来自Unity2.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)?如何预防这种情况?

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Budda    15 年前

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

    为了解决这个问题,我添加了额外的私有变量bool-bdisposed:

        protected override void Dispose(bool disposing)
        {
            if (_bDisposed)
                return;
    
            if ( disposing )
            {
                _context.Dispose();
            }
            _bDisposed = true;
    
            base.Dispose(disposing);
        }
    
        private bool _bDisposed;
    

    这是比尔·瓦格纳在《有效的C》(如果我没有犯任何错误的话)中提出的“处理”模式实现。

        2
  •  1
  •   Nicole Calinoiu    15 年前

    您是否在容器中注册了UnityManager实例?如果是这样,它将在容器被处置时由容器处置。