Używam kontrolera podstawowego, który ujawnia DataBase
właściwość, do której mają dostęp kontrolery pochodne.
public abstract class BaseController : Controller
{
public BaseController()
{
Database = new DatabaseContext();
}
protected DatabaseContext Database { get; set; }
protected override void Dispose(bool disposing)
{
Database.Dispose();
base.Dispose(disposing);
}
}
Wszystkie kontrolery w mojej aplikacji pochodzą BaseController
i są używane w następujący sposób:
public class UserController : BaseController
{
[HttpGet]
public ActionResult Index()
{
return View(Database.Users.OrderBy(p => p.Name).ToList());
}
}
A teraz odpowiedz na twoje pytania:
Kiedy powinienem utworzyć nowy kontekst DbContext / czy powinienem mieć jeden kontekst globalny, który mam przekazywać?
Kontekst powinien być tworzony na żądanie. Utwórz kontekst, zrób z nim to, co musisz, a następnie pozbądź się go. W przypadku rozwiązania klasy bazowej, z którego korzystam, musisz się tylko martwić o użycie kontekstu.
Nie próbuj mieć globalnego kontekstu (nie tak działają aplikacje internetowe).
Czy mogę mieć jeden globalny kontekst, którego mogę używać ponownie we wszystkich miejscach?
Nie, jeśli zachowasz kontekst wokół, będzie on śledzić wszystkie aktualizacje, dodatki, usunięcia itp., A to spowolni Twoją aplikację, a nawet może spowodować pojawienie się w niej dość subtelnych błędów.
Prawdopodobnie powinieneś zdecydować się na ujawnienie swojego repozytorium lub kontekstu kontrolerowi, ale nie obu. Posiadanie dwóch kontekstów umożliwiających dostęp za pomocą tej samej metody doprowadzi do błędów, jeśli obaj mają różne wyobrażenia o bieżącym stanie aplikacji.
Osobiście wolę ujawniać DbContext
bezpośrednio, ponieważ większość przykładów repozytoriów, które widziałem, i tak kończy się jako cienkie opakowania DbContext
.
Czy to powoduje spadek wydajności?
Pierwsze utworzenie pliku DbContext
jest dość kosztowne, ale po jego wykonaniu wiele informacji jest zapisywanych w pamięci podręcznej, dzięki czemu kolejne instancje są znacznie szybsze. istnieje większe prawdopodobieństwo, że problemy z wydajnością wynikają z utrzymywania kontekstu, niż w przypadku tworzenia ich za każdym razem, gdy potrzebujesz dostępu do bazy danych.
Jak wszyscy to robią?
To zależy.
Niektórzy ludzie wolą używać struktury iniekcji zależności, aby przekazać konkretne wystąpienie ich kontekstu do kontrolera podczas jego tworzenia. Obie opcje są w porządku. Mój jest bardziej odpowiedni dla aplikacji na małą skalę, w których wiesz, że używana baza danych nie ulegnie zmianie.
niektórzy mogą twierdzić, że nie możesz tego wiedzieć i dlatego metoda wstrzykiwania zależności jest lepsza, ponieważ sprawia, że aplikacja jest bardziej odporna na zmiany. Moja opinia na ten temat jest taka, że prawdopodobnie się nie zmieni (SQL server i Entity Framework nie są niejasne) i że najlepiej spędzam czas na pisaniu kodu specyficznego dla mojej aplikacji.