ASP.NET MVC вводить по запросу - PullRequest
5 голосов
/ 10 октября 2010

Мне нужно ввести контекст EF для каждого запроса. Есть ли способ реализовать это?

Ответы [ 3 ]

6 голосов
/ 10 октября 2010

Вы проверили этот отличный блог по DI с Unity и ASP.NET MVC?

Должен помочь вам встать на правильный путь.

Ответ да , вы можете - и в статье показано, как.

Короче говоря, вы создаете HttpContextLifetimeManager для обработки «областей видимости» ваших объектов. Контейнер «кэширует» экземпляр в контексте HTTP.

Это необходимо, потому что менеджеры времени жизни по умолчанию, предоставляемые Unity, не охватывают определение контекста HTTP "с полки".

Конечно, другие контейнеры DI (такие как StructureMap - которые я использую), делают.

Здесь - еще одна (более свежая) статья на ту же тему, с "Nerdinner" в качестве примера.

5 голосов
/ 10 октября 2010

Решение , предложенное в списке обсуждения Unity, заключается в создании дочернего контейнера для каждого запроса, создании этого дочернего контейнера в качестве контекста EF в виде ContainerControlledLifetime и размещении дочернего контейнера в конце запроса.При этом вам не нужно создавать собственный LifetimeManager.

Я не очень знаком с Unity, но принцип будет примерно таким:

Application_BeginRequest(...)
{
  var childContainer = _container.CreateChildContainer();
  HttpContext.Items["container"] = childContainer;
  childContainer.RegisterType<ObjectContext, MyContext>
     (new ContainerControlledLifetimeManager());
}

Application_EndRequest(...)
{
  var container = HttpContext.Items["container"] as IUnityContainer
  if(container != null)
    container.Dispose();
}
1 голос
/ 10 октября 2010

Что вы подразумеваете под инъекцией? Вы хотите применить принцип инверсии зависимостей? Если да, то представляете ли вы когда-нибудь себя, меняя свой контекст EF с каким-то другим контекстом, который придерживается того же контракта?

Для меня вы должны инкапсулировать EF-контекст где-нибудь в платформе, чтобы каждый запрос получал EF DataContext. Примените DI в вашем хранилище. Позже ваши репозитории могут иметь различные типы контекстов, и вы можете переключаться между собой.

...