Unity中的递归和Dispose模式实现

时间:2010-06-02 16:11:41

标签: 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)?怎么预防?

感谢。

2 个答案:

答案 0 :(得分:2)

感谢妮可,我找到了一个理由......谢谢。 但是在这种情况下如何处置容器?如果为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”模式实现(如果我没有任何错误)

答案 1 :(得分:1)

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