Каков наилучший способ создания и утилизации DbContext в MVC? - PullRequest
30 голосов
/ 09 августа 2011

MVC 3 + EF 4.1

Я выбираю один из двух подходов для работы с DbContext:

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

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

Ответы [ 3 ]

18 голосов
/ 09 августа 2011

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

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

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

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

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

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

2-й подход: контроллер не должен знать, как создать ваше UoW (DbContext). Цель не уменьшить сцепление между компонентами.

2 голосов
/ 09 августа 2011

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

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

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

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

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