2014-01-13 2 views
3

Это общий вопрос, хотя у меня есть конкретный экземпляр, на который я смотрю, поэтому я стараюсь сохранить заголовок и теги как можно более общие.Выбрасывает ли объект все свойства IDisposable?

Я делаю проект MVC с IOC. Мои конкретные репозитории реализуют IDisposable, чтобы избавиться от контекста Ef.

Очевидно, что MVC обрабатывает объект Controller, который вызывается. Однако мне нужно переопределить Dispose() в контроллере? Вот мой код, как прямо сейчас:

private IUserRepository repository; 

public UserController(IUserRepository repository) { 
    this.repository = repository; 
} 

protected override void Dispose(bool disposing) { 
    if (repository is IDisposable && repository != null) { 
     (repository as IDisposable).Dispose(); 
     repository = null; 
    } 

    base.Dispose(disposing); 
} 

проверить, чтобы убедиться, что он реализует IDisposable как на Mocks из моих модульных тестов я не думаю реализовать.

Теперь, мой вопрос в том, что переопределение Dispose() избыточное? Когда Controller (или любой другой объект) получает доступ, собирает ли Garbage Collector любые свойства, которые реализуют IDisposable, или я делаю это правильно?

+2

Dispose - это просто вызов метода - он не имеет ничего общего с Garbage Collector, и ничего не происходит, что явно не реализовано методом Dispose. – Joe

ответ

8

Устранение объекта не автоматически распределяет все его свойства, которые являются IDisposables. Все, что он делает, это выполнить метод Dispose, то, что делает объект, зависит от разработчика.

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

Я думаю, статья Стивена Клири о IDisposable: What Your Mother Never Told You About Resource Deallocation объясняет об утилизации объектов и о трудностях и проблемах, которые могут возникнуть в некоторых обстоятельствах.

+0

Вот что я думал. Мой мозг только что вращался с другими проблемами в течение последних нескольких дней, и я не был уверен, существует ли такая оптимизация или нет. Я сделал поиск и не смог найти ответа, поэтому я также хотел получить ответ для других новичков, которые, возможно, тоже выглядели. – krillgar

4

Dispose никогда не вызывается автоматически, даже сборщиком мусора. Если объект A управляет жизненным циклом объекта B, и если объект B является одноразовым, объект A также должен быть одноразовым и должен вручную вызывать метод Dispose объекта B.

3

Нет, это не избыточно. Это ваша работа по внедрению IDisposable в любом классе с одноразовыми членами.

Ваш чек может быть излишним. Вы должны настроить насмешливость, чтобы разрешать вызовы метода Dispose в вашем объекте репозитория, даже если вы реализуете его как метод «ничего не делать» для насмешек.

Вы должны взглянуть на Disposable Pattern

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

Смежные вопросы