Каков наилучший способ создания экземпляра DbContext в MVC?
MVC 3 + EF 4.1
Я выбираю между двумя подходами к работе с DbContext:
- Создайте экземпляр
Application_BeginRequest
, введите его в
HttpContext.Current.Items
и располагайте в Application_EndRequest
.
- Создайте одноразовый UnitOfWork (классная оболочка для
DbContext
) и
запустите каждое действие контроллера с помощью using(var unitOfWork = new
UnitOfWork()) { ... }
Поделитесь своим опытом: какой из них вы бы предпочли? какие плюсы и минусы для каждого подхода?
Ответы
Ответ 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, вам может даже не понадобиться контекст для каждого запроса.
Ответ 3
Не помещайте DbContext в global.asax!