Статическое поле DbContext в Global.asax против поля экземпляра DbContext в классе контроллера? - PullRequest
5 голосов
/ 31 января 2011

Честно говоря, я новичок в C # и Asp.net MVC. Я также не знаю, как на самом деле работает веб-приложение asp.net на IIS и ASP.NET framework за сценой.

Меня смущает решение, в котором я должен объявить поле DbContext (или любой класс, производный от DbContext) в моем приложении asp.net mvc.

У меня есть два варианта:

  1. Объявите поле как статическое поле внутри global.asax, чтобы его могли использовать все контроллеры.
  2. Объявите поле как поле экземпляра внутри каждого класса контроллера.

Не могли бы вы объяснить, какой из них правильный? Более подробное объяснение действительно необходимо.

Ответы [ 2 ]

8 голосов
/ 31 января 2011

Если вы сделаете это статическим полем в global.asax, у вас возникнут проблемы с параллелизмом.Несколько потоков из нескольких запросов могут входить и получать данные друг друга.Что еще хуже, это не будет отображаться до тех пор, пока вы не начнете получать больше трафика на своем сайте или пока вы не начнете нагрузочное тестирование.Вы реализуете его как одиночный, все будет хорошо работать в вашем тестировании, и вы подумаете: «Я гений! Посмотрите, насколько чиста эта реализация!»Но однажды вы будете сожжены этим, как и я.Результаты будут перепутаны, пользователи начнут видеть данные, которые не принадлежат им, и веб-сайт будет вести себя неожиданно.

Классы контекста для Entity Framework и LINQ to SQL были разработаны для упрощенной реализациичто-то, что вы настроили для каждого набора запросов, которые вы хотите выполнить.Он не рассчитан на долгую жизнь.

Проверьте этот другой вопрос / ответ по переполнению стека на ту же тему, сформулированный по-другому.

4 голосов
/ 31 января 2011

Вы должны пойти со вторым вариантом.т.е. объявить и использовать его в контроллере.Если вы поместите DBContext в качестве статического поля в global.asax, вы в основном сделаете его одним экземпляром для всего приложения.

С другой стороны, со вторым вариантом у вас есть DBcontext для каждого запроса.Было бы лучше, если бы вы могли использовать внедрение зависимостей для получения DBContext в каждом методе действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...