2014-11-03 10 views
8

W MVC 5, kody rusztowania będzie miał coś takiego:Pozbyć się DbContext w kontrolerze MVC, który sposób jest "lepszy"?

public class MyController : Controller 
{ 
    private MyContext db = new MyContext(); 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

inaczej, muszę mieć

using (var db = new MyContext()) 
{...} 

w każdej akcji.

Kody wyglądają dobrze, więc nie potrzebuję używać przy każdym działaniu. Czy jednak ten przedmiot jest preferowany przez programistów, czy taki styl ma pewną przewagę nad używaniem w każdym działaniu, które musi korzystać z dbcontext?

Odpowiedz

6

Oba rozwiązania są dobre - oba rozwiązania usuwają kontekst db. Ale moim zdaniem druga opcja będzie lepsza - stworzysz kontekst db w tym miejscu, w którym musisz.

Ale co, jeśli inna klasa (jakaś klasa usług) również używa kontekstu db. Dobrą praktyką jest posiadanie jednego kontekstu db dla całego żądania internetowego. W takim przypadku należy przekazać poprzednio utworzony kontekst db do wszystkich klas, które używają kontekstu db, aby zapobiec tworzeniu nowego kontekstu db we wszystkich klauzulach. Rozważę więc użycie kontenerów IoC. Kontener IoC rozwiąże twoje zależności, a także będzie zarządzał czasem życia obiektu. Bellow

wymieniłem kilka pojemników IOC:

+1

Oba rozwiązania dają taki sam wynik, ale oba nie są dobrymi rozwiązaniami. Powodem, dla którego szablon ma pojedynczy tekst DbContext, jest ułatwienie testowania, a to wyraźnie zagraża osobie zadającej pytanie. – Ben

1

A Instrukcja using wywołuje automatycznie metodę Dispose() na końcu bloku Using. Instrukcja Using wywołuje metodę Dispose(), nawet jeśli wystąpił błąd w kodzie.

1

Pod względem najlepszych praktyk, należy bezwzględnie używać szablonu rusztowaniem rzeczy, a nie bałagan z wzorcem using(){}, chyba że masz jakiś naprawdę dobry, nadrzędny powód. Oba rozwiązania dają taki sam wynik, ale oba nie są dobrymi rozwiązaniami. Powodem, dla którego szablon ma jeden DbContext jest łatwiej testu - Herezje przykład:

public class SomeController : Controller 
{ 
    private ApplicationDbContext db; 

    public AccountController() 
    { 
     db = new ApplicationDbContext(); 
    } 

    public AccountController(ApplicationDbContext context) 
    { 
     db = context; 
    } 
} 

Pierwszy konstruktor bez argumentów jest to, co jest wykorzystywane w produkcji i automatycznie tworzy kontekst nowy db w oparciu o plik konfiguracyjny aplikacji. Drugi pozwala wstrzykiwać wyszydzony kontekst db podczas przeprowadzania testów jednostkowych.

Podsumowując, to pytanie i moja odpowiedź nie dotyczą dystrybucji kontekstów db - chodzi o to, dlaczego projektanci szablonów kodu przyjęli podejście, które zrobili i dlaczego to ci pomoże. Powinieneś przeprowadzić test jednostkowy na read more on.

+0

Wyjaśniłeś dobrze profesjonalistę i przeciwnika pod innym kątem. Jednak korzystanie z nich ułatwia refaktoryzację.Na przykład w niektórych ostatnich projektach, mam DbContext poza kontrolerem przez posiadanie DAL na górze DBContext, mimo że sam DBContext jest DAL. Takie podejście powoduje, że kontroler staje się bardzo cienką warstwą transportową. Jeśli chcę, mogę łatwo dostarczyć te same dane przez WCF. – ZZZ

Powiązane problemy