Рекурсия в реализации шаблонов Unity и Dispose - PullRequest
2 голосов
/ 02 июня 2010

Мой класс унаследован от 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;
    }

Когда вызывается метод Dispose для экземпляра класса UnityManager, он переходит в рекурсию ... Почему? Насколько я знаю, base.Dispose должен вызывать метод Dispose только базового класса ... не так ли? Кто перезвонит Dispose (bool) UnityManager? Как это предотвратить?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Благодаря Николь я нашел причину ... спасибо. Но как утилизировать контейнер в этом случае? В случае вызова 'Dispose' для экземпляра UnityManager 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;

Это реализация шаблона "Dispose", предложенная Биллом Вагнером в "Effective C #" (если я не ошиблась)

1 голос
/ 02 июня 2010

Вы зарегистрировали свой экземпляр UnityManager в контейнере? Если это так, он будет утилизироваться контейнером при утилизации контейнера.

...