7

Wszystko,Unity Lifetime Menedżerowie i EF Dane kontekstowe -> Najlepsze praktyki

Odnotowano wiele postów na temat Menedżerów Lifetime Unity ale muszę jeszcze znaleźć ktoś podać dobrą zasada dla „w tych przypadkach powinieneś zawsze używać X ". Pozwól mi opisać moją aplikację, mam aplikację sieci Web ASP.NET MVC 4. Mam rozwiązanie Visual Studio zawierające 3 projekty, mój projekt "Core", który ma wszystkie moje rzeczy EF, testowanie projektu i MVC Web Project. Używam jedności dla wstrzykiwania zależności i następujący kod teraz:

// Context 
container.RegisterType<IDatabaseFactory, DatabaseFactory>(
    new ContainerControlledLifetimeManager(); 
container.RegisterType<UnitOfWork>(
    new ContainerControlledLifetimeManager()); 

Jednak ja widząc, że mój kontekst nie jest odtwarzany z każdym nowym wniosku internetowej, która jest co myślę chciałbym (niech mnie wiem, czy się mylę w tym założeniu). Mam ciężko analizując wszystkie informacje z poniższych witryn i przeczytałem o wielu ludziach tworzących własną klasę o nazwie PerHttpRequestLifetimeManager, aby sobie z tym poradzić.

Jaka jest tutaj najlepsza praktyka?

  1. Zrozumienie Menedżerowie Lifetime by Developer Network Microsoftu - http://msdn.microsoft.com/en-us/library/ff660872(v=PandP.20).aspx
  2. MVC DI & Unity z Lifetime Managera poprzez CodeProject - http://www.codeproject.com/Articles/424743/MVC-DI-Unity-with-Lifetime-Manager
  3. ASP.NET MVC Wskazówka: Dependency Injection z Unity Block aplikacji poprzez Shiju Varghese Blog - http://weblogs.asp.net/shijuvarghese/archive/2008/10/24/asp-net-mvc-tip-dependency-injection-with-unity-application-block.aspx
  4. MVC, EF - pojedyncza instancja DataContext Per-Web-Request w jedności przez przepełnienie stosu - MVC, EF - DataContext singleton instance Per-Web-Request in Unity
  5. Wstrzyknij ten sam element danych t instancji w wielu typach z Unity przez Stack Overflow - Inject same DataContext instance across several types with Unity
+0

Powiązane: http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why. – Steven

Odpowiedz

6

Tak, zwykle potrzebujesz jednego DbContext na żądanie.

PerHttpRequestLifetimeManager lub kontener podrzędny utworzony na każde żądanie to typowy sposób obsługi.

Najnowsza wersja Unity wprowadza Unity bootstrapper for ASP.NET MVC, która ma nowego wbudowanego menedżera życia: PerRequestLifetimeManager.

Możesz przeczytać więcej w rozdziale Developer's Guide to Dependency Injection Using Unity rozdział 3, Dependency Injection with Unity.

+2

Hej Randy! Trochę stara odpowiedź, ale mój problem jest z tym naprawdę związany. Używam 'PerRequestLifetimeManager', aby zarejestrować mój kontekst w Unity:' container.RegisterType (nowy PerRequestLifetimeManager(), new InjectionConstructor()); '- ale DbContext nigdy nie jest usuwany na żądanie. Zawarłem również tę linię w metodzie 'RegisterTypes':' DynamicModuleUtility.RegisterModule (typeof (UnityPerRequestHttpModule)); 'ale kiedy to zrobię, DbContext zostanie usunięty przed zakończeniem żądania. Jakieś pomysły? –