【问题标题】:Recursion in Unity and Dispose pattern implementationUnity 和 Dispose 模式实现中的递归
【发布时间】:2010-06-02 16:11:40
【问题描述】:

我的类继承自 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)?如何防止这种情况?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    感谢 Nicole,我找到了原因……谢谢。 但是在这种情况下如何处理容器呢?在 UnityManager 实例调用“Dispose”的情况下,base.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;
    

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

    【讨论】:

    • 您不应该向自己注册容器。详情请参阅unity.codeplex.com/Thread/View.aspx?ThreadId=46415#Post156036 的帖子。
    • 没有太多细节,除了:永远不要向自己注册容器。它已经为您完成了(Unity 1.2 中的新功能),因此您不会获得任何东西,并且您将在处置时获得堆栈溢出。只需在您的对象中添加对 IUnityContainer 的依赖项,它就会起作用。但这解释了我很多。 :) 谢谢!
    【解决方案2】:

    您是否在容器中注册了 UnityManager 实例?如果是的话,会在容器被销毁的时候被容器销毁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-25
      • 2019-01-15
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 2020-08-13
      相关资源
      最近更新 更多