Сначала ответим на ваш вопрос. Шаблон dispose отличается от деструктора C ++. Метод Dispose
предназначен для удаления ресурсов , содержащихся в классе , вместо удаления самого класса .
Причина пометки деструкторов C ++ как virtual
не существует в .NET, потому что каждый экземпляр ссылочного типа имеет блок синхронизации, который содержит информацию о типе времени выполнения. Используя это, сборщик мусора может надлежащим образом восстановить правильный объем памяти.
Что касается расширения IRepository
с помощью IDisposable
, это будет быстрое решение, которое будет приемлемым в подавляющем большинстве случаев. Единственное возражение, которое я вижу, состоит в том, что расширение интерфейса потребует всех производных классов для реализации интерфейса. На первый взгляд может показаться простым реализовать интерфейс с NOP (возможно, несколько раз), но это не обязательно. Но я могу предложить альтернативу.
Вместо этого рассмотрите возможность использования абстрактного базового класса, который реализует шаблон Dispose. Это будет соответствовать структуре «стандартной» реализации шаблона dispose.
public abstract class Repository : IDisposable
{
public void Dispose() { Dispose(true); }
protected virtual Dispose(bool disposing) { }
}
public class NHibernateRepository : Repository { /* Impl here, add disposal. */ }
public class TestRepository : Repository { /* Impl with no resources */ }
Взгляните на Рекомендации по утилизации шаблонов , написанные Microsoft, чтобы увидеть более подробный пример.