Реализация Idisposable на контроллере mvc3 - PullRequest
1 голос
/ 21 августа 2011

У меня есть контроллер, который создает экземпляр базы данных для EF.(Как я уверен, большинство из них не реализуют шаблон репозитория.)

Когда я запустил анализ кода в своем проекте, он рекомендовал реализовать IDisposable, поэтому я написал следующий код.

    #region Implementation of IDisposable
    public void Dispose()
    {
        Console.WriteLine("Dispose");
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    // The bulk of the clean-up code is implemented in Dispose(bool)
    protected override void Dispose(bool disposing)
    {
        Console.WriteLine("Dispose(disposing)");
        if (disposing)
        {
            // free managed resources
            if (_dataService != null)
            {
                ((IDisposable)_dataService).Dispose();
                _dataService = null;
            }
            // free managed resources
            if (_db != null)
            {
                ((IDisposable)_db).Dispose();
                _db = null;
            }

        }
        base.Dispose(disposing);

    }
    #endregion

Я тоже пытался это сделать.

protected new virtual void Dispose(bool disposing)

Но мои операторы console.writeline никогда не выполняются.Что я делаю неправильно?Почему Dispose () не вызывается на моем контроллере?

Ответы [ 2 ]

2 голосов
/ 21 августа 2011

ты не делаешь ничего плохого.Вы получаете рекомендацию, потому что вы держите в своем классе некоторые поля (cotnroller), которые реализуют IDisposable.Фреймворк будет вызывать «перегрузочную» версию, поэтому просто переместите туда весь свой код.

Подробности о MSDN

Кстати, вы не увидите консоль-запись- используйте System.Diagnostic.Debug.WriteLine вместо

2 голосов
/ 21 августа 2011

Лично я считаю, что в этой ситуации лучше всего отделить контекст базы данных от контроллера и переместить его на уровень обслуживания.Вы можете заставить этот класс реализовать IDisposable и передать ссылку на класс уровня обслуживания контроллеру для его использования

При этом вы создадите контроллер, который не зависит от базы данных.Термин тощие контроллеры, толстые модели применяется здесь.сервисный уровень будет служить моделью в этом случае.Вы также можете выполнить модульное тестирование сервисного уровня и контроллера (если хотите) изолированно друг от друга

...