@SomeOneThere
.NET Developer

Как правильно созвать контекст EF в конроллере asp.net?

В статье на хабре habrahabr.ru/post/250009 в комментариях хабраюзер с ником OnYourLips написал
> using (ApplicationDbContext db = new ApplicationDbContext())
> В контроллере это кажется ужасным.
Вопрос, а как тогда правильно и не ужасно? Где посмотреть best practices? На хабре я ридонли, так что не могу спросить непосредственно там.
  • Вопрос задан
  • 3470 просмотров
Пригласить эксперта
Ответы на вопрос 3
Valeriy1991
@Valeriy1991
Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
Всем добрый день!

Правильно - создавать трехслойную архитектуру

Открывать контекст EF в методе действия контроллера - плохая практика. Плохая потому что:
1. это не соответствует трехуровневой архитектуре, а следовательно, значительно усложняет внесение изменений, масштабирование и сопровождение приложения;
2. это сразу показывает низкий уровень понимания шаблона MVC - могут даже на работу не взять;
3. EF - это модель. А контроллер по сути своей должен лишь получить данные (модель) и передать их в представление. То, каким образом формируются данные (EF, NHibernate, XML, Files, ...) - контроллер не должно волновать. Он лишь организовывает данные, чтобы передать их в представление. Часто модель разделяют на непосредственно модель и модель представления (аналог шаблона MVVM). Контроллер получает данные (модель), из них формирует модель представления и её передает в само представление. Зачем это надо - уже другой вопрос.

Далее - позволю себе не согласиться с инициализацией контекста EF на весь контроллер - можно, конечно, но это, опять-таки, плохая практика, потому что:
1. возникнут проблемы с использованием многопоточности и параллельных вычислений при работе с контекстом (библиотека TPL);
2. возникнет проблема "устаревания" данных - т.к. контекст создан на контроллер, то придется постоянно его обновлять;
3. это, опять же, показывает уровень и опыт разработчика, а следовательно, снижаются шансы при трудоустройстве (туда, где я сейчас работаю - точно не взяли бы программистов, которые практикуют формирование модели в контроллере или которые инициализируют контекст в контроллере или при запросе).

Итог: контекст EF должен существовать как можно меньшее время - ровно столько, чтобы получить данные, обработать их, сформировать из них, например, другие объекты (обертки, модели, модели представлений).

Читайте книгу "ASP.NET MVC 3/4/... Framework с примерами на C# для профессионалов" Адама Фримена и Стивена Сандерсона - там, можно сказать, приведены best practices по разработке в ASP.NET MVC с использованием EF.

А вообще - всё зависит от задачи/проекта. Если это какой-нибудь учебный проект или ооооочень простое приложение - то можно для упрощения контекст инициализировать и в методе действия (контекст на метод действия), и при запросе (контекст на контроллер). Однако если Вы хотите повышать свой профессиональный уровень и заниматься enterprise-приложениями, то опытным путем Вы выясните, что самый лучший способ - это инициализация контекста на конкретную задачу.

Удачи!

P.S. Ничего плохого не имею против хабра (сам частенько читаю), но хабр - это не учебник, а источник разрозненной, но полезной информации. А Вам сейчас, судя по всему, нужна теория Структурированная теория. Найдите время и изучите "мат.часть". Поверьте, большинство вопросов по разработке на ASP.NET MVC у Вас просто отпадет.
Ответ написан
Комментировать
@Eugene22
Ничего ужасного тут нет, вполне допустимо.
Ответ написан
Комментировать
Обычно ASP.NET stateless поэтому создавать свой контекст на каждый запрос это правильно. Вариант создавать контекст в action имеет право на жизнь, но мне больше нравиться так:
public class RequestsController : Controller
    {
        /// <summary>
        /// Application DB context
        /// </summary>
        protected ApplicationDbContext db  = new ApplicationDbContext();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы