Jaki jest najlepszy sposób na utworzenie i usunięcie DbContext w MVC?

MVC 3 + EF 4.1

Wybieram między dwoma podejściami do radzenia sobie z DbContext:

  1. Instantiate in Application_BeginRequest, put it into HttpContext.Current.Items i usunąć Application_EndRequest.
  2. utworzyć jednorazowy UnitOfWork (kindof wrapper dla DbContext) i Uruchom każdą akcję kontrolera za pomocą using(var unitOfWork = new UnitOfWork()) { ... }

Podziel się swoim doświadczeniem proszę: które wolisz? jakie są plusy i minusy każdego podejścia?

Author: Pratik, 2011-08-09

3 answers

Sugerowałbym użycie struktury Dependency Injection. Możesz zarejestrować swoje DbContext zgodnie z żądaniem

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

I wstrzyknąć go jako parametr konstruktora do kontrolera.

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

Jeśli zarejestrowany typ implementuje IDisposable, to struktura DI usunie go po zakończeniu żądania.

Pierwsze podejście: o wiele czystsze jest używanie ID framework niż ręczne implementowanie go. Ponadto wszystkie Twoje prośby mogą nie potrzebować Twojego UoW.

Drugie podejście: kontroler nie powinien wiedzieć, jak skonstruować UoW (DbContext). Celem nie jest zmniejszenie sprzężenia między komponentami.

 18
Author: Eranga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-09 01:08:28

Obecnie używamy repozytoriów wtryskiwanych z UOW (unit of work) utworzonych za pomocą lokalizatora usług z fabryki repozytorium. Jedność kontroluje życie w ten sposób odbierając Ci pracę.

Twoja konkretna implementacja będzie się różnić w zależności od tego, czy używasz POCO, obiektów encji itp..

Ostatecznie chcesz UoW, jeśli zamierzasz pracować z więcej niż jednym zestawem obiektów w kontrolerze, aby upewnić się, że używasz tylko jednego kontekstu. To utrzyma twoje transakcje w ryzach itd.

Jeśli zamierzasz używać wielu obiektów (np. wiele EDMX), będziesz chciał spojrzeć na korzystanie z UOW z MSDTC...ale to pewnie więcej, niż chciałeś wiedzieć. W końcu, ważne jest, aby upewnić się, że po prostu tworzysz instancję tego, czego potrzebujesz do akcji kontrolera (tj. jednej instancji kontekstu.). Nie sądzę, bym poszedł z Begin_Request, możesz nawet nie potrzebować kontekstu dla każdego żądania.

 2
Author: Chris Yeaste,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-09 00:43:01
 -1
Author: Ofer Zelig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:08:23