Нужно ли реализовывать IDisposable при использовании Entity Framework в MVC? - PullRequest
5 голосов
/ 27 марта 2012

Я вижу во многих примерах MVC , Репозиторий шаблон, Единица работы и EF , например здесь , что и интерфейсы, и классы реализуют интерфейс IDisposable. Я предполагаю, что этот интерфейс предоставляет только метод Dispose() с двумя перегрузками.

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

Или, даже если это не так, я думаю, что с помощью инфраструктуры внедрения зависимостей, такой как Ninject , мы делегируем все эти задачи удаления самой структуре.

Может также случиться, что реализация IDisposable требовалась в более старой версии EF или MVC.

Кто-нибудь может указать мне правильное направление?

UPDATE

Автоматическое удаление контекста можно увидеть в многоуровневом приложении с Service и Repository layer. Предположим, что из обоих компонентов мы возвращаем IQueryable<T> объекты, если мы пытаемся заполнить объекты из контроллера, перебирая его элементы или вызывая метод ToList(), мы получаем ошибку времени выполнения, сообщающую, что контекст недоступен (закрыт) * ​​1041 *

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Обычный шаблон - наличие экземпляра репозитория в каждом контроллере и связывание утилизации в Dispose () контроллера.

Так что я бы сказал, что шаблон обычно требуется.

Однако во многих других примерах старших программистов я не вижу такой реализации.

Есть несколько возможностей:

  • это демонстрационный код, обработка ошибок и ресурсов опущена.
  • шаблон реализован в неочевидном месте (базовый класс)

Укажите на конкретный пример, и мы сможем это выяснить.

2 голосов
/ 27 марта 2012

Что касается состояния соединения, EF, как предполагается, неплохо поддерживает только открытое соединение, пока оно необходимо (http://msdn.microsoft.com/en-us/library/bb896325.aspx). Ссылка также показывает, как получить более точный контроль над состоянием соединения.

2 голосов
/ 27 марта 2012

Обычно в большинстве примеров вы можете найти у интернера шаблон Repository, используя EF, в контексте есть метод Dispose.

Теперь вам не нужно обязательно вызывать метод Dispose для Context, но это может быть хорошей практикой по следующей причине:

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

Для ленивых: вы можете даже обернуть контекст в оператор using, который вызовет dispose для вас, когда объект выйдет из области действия самого использования

подробнее на:

http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/2625b105-2cff-45ad-ba29-abdd763f74fe/

здесь вы также можете найти пример, касающийся репозитория в EF

http://www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C

...