Объявление DbContext для контроллера MVC

Рассматривая некоторые примеры MVC в Интернете, я вижу, что обычно в контроллере переменная DbContext объявляется как частная переменная-член (то есть глобальная) и доступна для всех методов.

Но недавно я наткнулся на статью об идентификаторе ASP.NET и заметил в контроллере, DbContext объявлен в каждом методе (который требует его).

Есть ли преимущество безопасности для этого подхода? Возможно, ограничение продолжительности жизни объекта (ов) безопасности для лучшей общей безопасности?!?!

Если нет, то я вижу, что первый подход более эффективен, когда контекст базы данных создается при загрузке контроллера.

Ниже все, что я могу найти о DbContext, но ничего не ответить на мой вопрос.

Объявление DbContext - Framework 4.1 - MVC 3.0

MVC, DbContext и многопоточность

2 ответа

По каждому запросу создается новый экземпляр контроллера. Следовательно, для всех целей и целей не имеет значения, создается ли dbcontext в конструкторе или инкапсулирован в любом данном методе.

Помимо выбора стиля, причины объявлять и содержать dbcontext в данном методе:

  • Методы, которые ему не нужны, не будут создавать контекст, устраняя накладные расходы (если таковые имеются). Это также может быть выполнено с использованием ленивой схемы инициализации.
  • Контекст удаляется немедленно, как только с ним делается метод, а не в конце запроса. Как правило, это не должно быть проблемой; обычно, если пользователи ждут более чем на несколько секунд, у вас будет большая проблема.
  • Различные методы используют разные контексты.

Среди прочего, некоторые причины объявить один контекст и создать экземпляр его один раз:

  • У вас есть только одно место, которое создает контекст, а не многие. В типичном приложении большинство страниц потребует некоторой информации из базы данных.
  • Методы, вызывающие другие методы, не будут удерживаться в собственном экземпляре объекта контекста.
  • Вы можете создать класс базового контроллера, который по умолчанию создает объект dbcontext, позволяя вам быть сухим во всех унаследованных контроллерах.


Ответ от @Ic. довольно хорошо. Я хотел бы добавить, что если вам нужно передать информацию из вашего запроса в свой конструктор DbContext, вам нужно создать экземпляр вашего DbContext внутри ваших методов действий. Причина в том, что объект Request будет равен null, пока элемент управления не войдет в ваш метод действия.

Дополнительная информация: Мне нужно было построить строку подключения динамически в зависимости от местоположения пользователя. Я сохранил местоположение в качестве файла cookie, к которому я обращался через объект Request. У меня был действительный запрос внутри метода действия, но он был null внутри конструктора или свойств класса контроллера.

licensed under cc by-sa 3.0 with attribution.