Должен ли я реализовать IDisposable на всех классах или достаточно базового класса? - PullRequest
7 голосов
/ 15 ноября 2011

Мне сказали, что мне нужно избавиться от экземпляров классов репозитория Entity Framework , и я создал базовый класс для реализации этой реализации.

Мне нужно проверить с экспертами:приемлемо реализовать IDisposable через базовый класс?

Обратите внимание, что в классе репозитория нет переменных-членов класса.

/// Sample repository.  Note that I return List<T> as IEnumerable, 
/// and I use IDisposable 
///
public class CompanyRepository : DisposableBase, ICompanyRepository
{
    public IEnumerable<CompanyDetail> GetOneCompany(int? CompanyID)
    {
        var t = from c in _entities.CompanyDetail
                where c.CompanyID == CompanyID.Value
                select c;
        return t.ToList();
    }
}

/// <summary>
/// Disposable implementation based on advice from this link:
/// from Http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
/// </summary>
public class DisposableBase : IDisposable
{
    protected TLSAdminEntities1 _entities;

    public DisposableBase()
    {
        _entities = new TLSAdminEntities1();
        disposed = false;
    }

    private bool disposed ;
    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                _entities.Dispose();
            }
        }
        this.disposed = true;
    }
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

Ответы [ 5 ]

7 голосов
/ 15 ноября 2011

Ответ "это зависит".

Если метода «Dispose ()» в каком-либо суперклассе достаточно, вам, конечно, не нужно переопределять его в каждом подклассе.

«Суперкласс» может быть базовым классом; это может быть один или несколько подклассов.

Это зависит от того, что вы выделяете, и что нужно очистить.

ИМХО ...

Вот что говорит MSDN:

http://msdn.microsoft.com/en-us/magazine/cc163392.aspx

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

<= Другими словами, вам не обязательно заново внедрять Dispose снова и снова </p>

... но ...

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

4 голосов
/ 15 ноября 2011

Это зависит от того, есть ли у вас ресурсы в производном классе, которые нужно утилизировать. Если есть ресурсы, специфичные для производного класса, реализация IDisposable только для базового класса будет недостаточной.

1 голос
/ 15 ноября 2011

Говоря в общем, вы должны реализовать IDispoable в каждом классе, где у вас есть частные члены, которые сами реализуют IDisposable. Эти ресурсы должны быть «освобождены». Я настоятельно советую вам прочитать эту очень хорошую статью на CodeProject о шаблоне IDisposable.

0 голосов
/ 15 ноября 2011

это нормально, чтобы использовать базовый класс.здесь важна очистка неуправляемых ресурсов, что в данном случае означает закрытие соединений с базой данных.Я бы поспорил, что вам лучше подключиться к asp.net с такими вещами, как http-модули или фильтры действий, чтобы обработать вашу единицу работы и выполнить настройку для типа «единица работы на запрос», но есливместо этого вы просто убедитесь, что вызовите dispose для ваших экземпляров репозитория, имея базовый класс, который располагает контекстом структуры сущности, это нормально (и вы все равно можете использовать базовый класс для этих репозиториев даже с удалением их с помощью фильтра / модуля).*

0 голосов
/ 15 ноября 2011

НЕТ. у вас также в подклассах.

если вы этого не хотите, GC все равно нужно сопоставить своего ребенка как несвязанного - и ТОГДА собрать его ... чтобы вы ничего не заработали.

...