Ich verwende einen Basis-Controller, der eine DataBase
Eigenschaft verfügbar macht , auf die abgeleitete Controller zugreifen können.
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);
}
}
Alle Controller in meiner Anwendung stammen von folgenden Anwendungen BaseController
und werden wie folgt verwendet:
public class UserController : BaseController
{
[HttpGet]
public ActionResult Index()
{
return View(Database.Users.OrderBy(p => p.Name).ToList());
}
}
Um Ihre Fragen zu beantworten:
Wann sollte ich einen neuen DbContext erstellen / sollte ich einen globalen Kontext haben, den ich weitergebe?
Der Kontext sollte pro Anfrage erstellt werden. Erstellen Sie den Kontext, tun Sie, was Sie damit tun müssen, und entfernen Sie ihn dann. Mit der von mir verwendeten Basisklassenlösung müssen Sie sich nur um die Verwendung des Kontexts kümmern.
Versuchen Sie nicht, einen globalen Kontext zu haben (so funktionieren Webanwendungen nicht).
Kann ich einen globalen Kontext haben, den ich an allen Orten wiederverwenden kann?
Nein, wenn Sie einen Kontext beibehalten, werden alle Aktualisierungen, Ergänzungen, Löschungen usw. nachverfolgt. Dies verlangsamt Ihre Anwendung und kann sogar dazu führen, dass in Ihrer Anwendung einige ziemlich subtile Fehler auftreten.
Sie sollten sich wahrscheinlich dafür entscheiden, entweder Ihr Repository oder Ihren Kontext für Ihren Controller verfügbar zu machen, aber nicht für beide. Wenn zwei Kontexte über dieselbe Methode aufgerufen werden, führt dies zu Fehlern, wenn beide unterschiedliche Vorstellungen über den aktuellen Status der Anwendung haben.
Persönlich ziehe ich es vor, DbContext
direkt zu belichten, da die meisten Repository-Beispiele, die ich gesehen habe, DbContext
sowieso nur als dünne Wrapper enden .
Verursacht dies einen Leistungseinbruch?
Das erste Mal, wenn ein DbContext
erstellt wird, ist ziemlich teuer, aber sobald dies geschehen ist, werden viele Informationen zwischengespeichert, so dass nachfolgende Instanziierungen viel schneller sind. Es ist wahrscheinlicher, dass Leistungsprobleme auftreten, wenn ein Kontext beibehalten wird, als wenn Sie jedes Mal, wenn Sie Zugriff auf Ihre Datenbank benötigen, eines instanziieren.
Wie machen das alle anderen?
Es hängt davon ab, ob.
Einige Benutzer bevorzugen die Verwendung eines Abhängigkeitsinjektionsframeworks, um eine konkrete Instanz ihres Kontexts beim Erstellen an ihren Controller zu übergeben. Beide Optionen sind in Ordnung. Meins ist besser für eine kleine Anwendung geeignet, bei der Sie wissen, dass sich die verwendete Datenbank nicht ändern wird.
Einige argumentieren möglicherweise, dass Sie dies nicht wissen können, und deshalb ist die Methode der Abhängigkeitsinjektion besser, da sie Ihre Anwendung widerstandsfähiger gegenüber Änderungen macht. Ich bin der Meinung, dass sich dies wahrscheinlich nicht ändern wird (SQL Server und Entity Framework sind kaum unklar) und dass meine Zeit am besten damit verbracht wird, den für meine Anwendung spezifischen Code zu schreiben.