2017-03-05 3 views
1

Ich lerne MVC und ich habe einige Probleme mit einem Online-Kurs, den ich nehme und hoffe, dass Sie mir helfen können.Erzeuge DB-Aufruf im Konstruktor über Injection

Ich bin das folgende Beispiel zeigt:

public ActionResult Search() 
    { 
     var context = new DBFeedbackContext(); 
     ViewBag.CMC = context.Categories.Select(x => new SelectListItem() { Text = x, Value = x.Id.ToString() }).ToList(); 

     return View(); 
    } 

und sagte in dem Kurs „Das ist nicht, wie Sie in einem echten appliaction dies tun würden, würden Sie die Datenbank in dem Controller-Konstruktor über Dependency Injection nennen, aber für dieses einfache Beispiel ist das genug ". Er verlässt dann dieses Thema und kehrt nie zu ihm zurück.

Ich würde gerne wissen, worüber er spricht und wie Sie das tun würden, können Sie mir helfen?

+0

[ASP.NET MVC 4 Dependency Injection] (https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-dependency -Injektion) –

+0

Lesen Sie über die Konzepte der Inversion von Kontrolle und Abhängigkeitsinjektion. Es ist ein Thema, das zu weit gefasst ist, um hier zu antworten. –

Antwort

3

Dies ist eine völlig korrekte Vorgehensweise. Das einzige Problem, das ich hier sehe, ist, welcher Kontext nicht disposed ist. Sie sollten es wie folgt stattdessen schreiben:

public ActionResult Search() 
{ 
    using(var context = new DBFeedbackContext()) 
    { 
     ViewBag.CMC = context.Categories.Select(x => new SelectListItem() { Text = x, Value = x.Id.ToString() }).ToList(); 

     return View(); 
    } 
} 

Dependency Injection keine „goldenen Hammer“ für alles ist. Ich denke, was er versucht ist zu sagen, Sie sollten Datenbankverbindung pro Controller/Sitzung, und auf diese Weise Sie in der Tat besser, etwas zu tun wie folgt erstellen:

public class MyController : ApiController 
{ 
    private readonly DBFeedbackContext _context; 
    public MyController(DBFeedbackContext context) 
    { 
     _context = context; 
    } 

    public ActionResult Search() 
    { 
     ViewBag.CMC = _context.Categories.Select(x => new SelectListItem() { Text = x, Value = x.Id.ToString() }).ToList(); 
     return View(); 
    } 

    private ActionResult View(){ ... } 
} 

diese Weise können Sie Erstellung und Managment von Kontext zu delegieren in der Lage, Lebenszeit außerhalb Ihr Controller, weil es völlig außerhalb des Aufgabenbereichs Ihres Controllers ist zu lösen. Sie kümmern sich meist nicht einmal darum, wie es erstellt/entsorgt wird, Sie brauchen es nur, und das ist alles.

Obwohl es in den meisten Anwendungsfällen keinen Schaden gibt, wenn Sie ständig Kontexte erstellen, die nur im Verbindungspool übernommen/zurückgegeben werden, sonst nichts.

Verwandte Themen