Когда создать экземпляр контекста EF4 в ASP.NET MVC? - PullRequest
2 голосов
/ 15 июля 2011

Я нашел учебник на веб-сайте microsoft asp.net , который создает экземпляр из контекста следующим образом:

        public class HomeController : Controller
        {
            private MoviesDBEntities _db = new MoviesDBEntities(); 

            public ActionResult Index()
            {
                return View(_db.MovieSet.ToList());
            }

            ...
        }

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

        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                using(MoviesDBEntities _db = new MoviesDBEntities()){
                    return View(_db.MovieSet.ToList());
                }
            }
            ...
        }

, поэтому вопрос в том, Какой путь верен?или это вообще важно?

Ответы [ 3 ]

6 голосов
/ 15 июля 2011

Как правило, класс не должен отвечать за создание своих собственных зависимостей.

Лучше всего передать зависимость в конструктор: -

public class HomeController : Controller
{
  private IMovieRepository _db;
  public HomeController(IMovieRepository db)
  {
    _db = db;
  }

  public ActionResult Index()
  {
    return View(_db.MovieSet.ToList());
  }
}

Это называется «Внедрение зависимостей», и оно желательно, потому что оно уменьшает стандартный код, а также позволяет вам предоставлять другие реализации IMovieRepository во время выполнения (например, если вы тестируете модуль).

ASP.NET MVC имеет хук, позволяющий вам сделать это (ControllerBuilder), но, к счастью, вам не нужно накатывать свои собственные, есть готовые решения. Я рекомендую http://ninject.org/, потому что его очень легко настроить.

Таким образом, ваш контейнер IoC (независимо от того, в какую часть передается зависимость) может создавать только один контекст для каждого HTTP-запроса и удалять его в конце запроса.

Проверить, например, Что такое инверсия контроля?

2 голосов
/ 15 июля 2011

Это все о высвобождении ресурсов.

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

В ситуации без состояния (например, asp.net) сервер получает запрос, генерирует результат, отправляет его обратно и удаляет использованные ресурсы (включая контекст).

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

1 голос
/ 15 июля 2011

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

По моему мнению, примеры на официальном сайте asp.net часто просто «работают», а не являются хорошими примерами того, как создать приложение.

...