2017-03-05 81 views
1

我學習MVC在構造函數創建DB電話,我有一些麻煩的在線課程,我正在和希望你能幫助我。通過注射

我出了下面的例子:

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

     return View(); 
    } 

而且在使用過程中「這是不是你將如何在真實appliaction做到這一點,你會通過依賴注入調用控制器構造數據庫告訴記者,但是對於這個簡單的例子來說就足夠了「。 然後,他離開這個主題,永遠不會回到它。

我想知道他在說什麼,你會怎麼做,你們可以幫忙嗎?

+0

[ASP.NET MVC 4依賴注入(https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-dependency -injection) –

+0

閱讀關於控制反轉和依賴注入的概念。這是一個在這裏回答太寬泛的話題。 –

回答

3

這完全是做事的正確方法。我在這裏看到的唯一問題是什麼情況沒有被處置。你應該這樣寫:

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(); 
    } 
} 

依賴注入不是一切的「金錘」。我想,他想說的是你應爲每個控制器/會話數據庫連接,這樣,你確實好做這樣的事情:

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(){ ... } 
} 

這樣你就可以委託創建和上下文的同治一生控制器,因爲它完全是出於工作的範圍控制器解決。你甚至不關心它是如何創建/處置的,你只需要它,就這些。

雖然有在大多數使用情況沒有壞處,如果你不斷地創造環境,他們只是採取/返回連接池,沒有別的。