2017-03-05 83 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(){ ... } 
} 

这样你就可以委托创建和上下文的同治一生控制器,因为它完全是出于工作的范围控制器解决。你甚至不关心它是如何创建/处置的,你只需要它,就这些。

虽然有在大多数使用情况没有坏处,如果你不断地创造环境,他们只是采取/返回连接池,没有别的。