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:
- Instantiate in
Application_BeginRequest
, put it intoHttpContext.Current.Items
i usunąćApplication_EndRequest
. - 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?
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.
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.
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
Nie umieszczaj DbContext w global.asax! :
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