Подтвердить что ты не робот

Каков наилучший способ создания экземпляра DbContext в MVC?

MVC 3 + EF 4.1

Я выбираю между двумя подходами к работе с DbContext:

  • Создайте экземпляр Application_BeginRequest, введите его в HttpContext.Current.Items и располагайте в Application_EndRequest.
  • Создайте одноразовый UnitOfWork (классная оболочка для DbContext) и запустите каждое действие контроллера с помощью using(var unitOfWork = new UnitOfWork()) { ... }

Поделитесь своим опытом: какой из них вы бы предпочли? какие плюсы и минусы для каждого подхода?

4b9b3361

Ответ 1

Я предлагаю вам использовать инфраструктуру Injection Dependency. Вы можете зарегистрировать свой DbContext в соответствии с запросом

 container.RegisterType<MyDbContext>().InstancePerHttpRequest();

И добавьте его в качестве параметра конструктора в контроллер.

public class MyController : Controller
{
    public MyController(MyDbContext myDbContext)
    {
         _myDbContext = myDbContext;
    }
}

Если зарегистрированный тип реализует IDisposable, тогда среда DI будет утилизироваться после завершения запроса.

1-й подход: гораздо проще использовать инфраструктуру ID, чем вручную. Кроме того, все ваши запросы могут не нуждаться в вашем UoW.

Второй подход. Контроллер не должен знать, как построить ваш UoW (DbContext). Назначение не уменьшает сцепление между компонентами.

Ответ 2

В настоящее время мы используем репозитории, инъецированные с помощью UoW (единицы работы), созданной через локатор сервисов из репозитория factory. Unity контролирует всю жизнь таким образом, что отнимает у вас работу.

Ваша конкретная реализация будет зависеть от того, используете ли вы POCO, Entity Objects и т.д.

В конечном счете вы хотите UoW, если вы собираетесь работать с несколькими объектами в своем контроллере, чтобы обеспечить простое использование одного контекста. Это будет держать ваши транзакции в чеке и т.д.

Если вы собираетесь использовать несколько objectcontexts (т.е. несколько EDMX), вы захотите взглянуть на использование UoW с MSDTC... но это, вероятно, больше, чем вы хотели знать. В конце концов, важно убедиться, что вы просто инсталлируете то, что вам нужно для действия контроллера (т.е. Один экземпляр контекста). Я не думаю, что поеду с Begin_Request, вам может даже не понадобиться контекст для каждого запроса.