2014-11-03 14 views
8

In MVC 5 werden die Gerüste Codes haben so etwas wie:Disposed DbContext in MVC Controller, welcher Weg "besser"?

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

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

sonst, ich brauche

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

in jeder Aktion haben.

Die Codes sehen gut aus, daher muss ich nicht in jeder Aktion verwenden. Wird dies jedoch von den Programmierern bevorzugt, oder hat ein solcher Stil einen Vorteil gegenüber der Verwendung in jeder Aktion, die den dbcontext verwenden muss?

Antwort

6

Beide Lösungen sind gut - beide Lösung wird Db-Kontext verfügen. Aber meiner Meinung nach wird die zweite Option besser sein - Sie erstellen den db-Kontext genau dort, wo Sie müssen.

Aber was ist, wenn eine andere Klasse (einige Service-Klasse) auch Db-Kontext verwendet. Es empfiehlt sich, einen db-Kontext für die gesamte Webanforderung zu verwenden. In diesem Fall sollten Sie den zuvor erstellten db-Kontext an alle Klassen übergeben, die den db-Kontext verwenden, um das Erstellen eines neuen db-Kontexts in allen Klassen zu verhindern. Also werde ich die Verwendung von IoC-Containern in Betracht ziehen. IoC-Container löst Ihre Abhängigkeiten und verwaltet auch die Objektlebensdauer. Bellow

ich einige IoC Container aufgelistet:

+1

Beide Lösungen produzieren das gleiche Ergebnis, aber beide sind keine guten Lösungen. Der Grund, warum die Vorlage einen einzelnen DbContext hat, besteht darin, dass es einfacher zu testen ist, und dies ist für die Person, die die Frage stellt, eindeutig verloren. – Ben

1

Eine Using-Anweisung ruft die Dispose() -Methode am Ende des Using-Blocks automatisch auf. Die Using-Anweisung ruft die Dispose() -Methode auf, selbst wenn ein Fehler im Code aufgetreten ist.

1

In Bezug auf Best Practices, sollten Sie unbedingt die Vorlage eingerüstete Sachen verwenden und nicht mit Zohan mit dem Muster using(){}, es sei denn, Sie haben einen wirklich guten zwingenden Grund. Beide Lösungen bringen das gleiche Ergebnis, aber beide sind keine guten Lösungen. Der Grund, warum die Vorlage eine einzige DbContext hat, ist es einfacher, Test zu machen - heres ein Beispiel:

public class SomeController : Controller 
{ 
    private ApplicationDbContext db; 

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

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

Der erste Konstruktor ohne Argumente ist, dass die in der Produktion verwendet wird, und erstellt automatisch eine neue db Kontext basiert auf die App-Konfigurationsdatei Die zweite Option ermöglicht es Ihnen, einen gespiegelten Db-Kontext zu injizieren, wenn Sie Komponententests durchführen.

Am Ende des Tages geht es bei dieser Frage und meiner Antwort nicht wirklich darum, db-Kontexte zu entsorgen - es geht darum, warum die Code-Template-Designer den Ansatz gewählt haben und warum er Ihnen hilft. Sie sollten read more on Einheit testen.

+0

Sie hatten die Vor- und Nachteile aus verschiedenen Blickwinkeln erklärt. Die Verwendung erleichtert jedoch das Refactoring.Zum Beispiel habe ich in einigen kürzlichen Projekten DbContext außerhalb des Controllers, indem ich eine DAL über DBContext habe, obwohl DBContext selbst eine DAL ist. Ein solcher Ansatz macht die Steuerung zu einer sehr dünnen Transportschicht. Wenn ich möchte, könnte ich die gleichen Daten problemlos über WCF liefern. – ZZZ

Verwandte Themen