我正在学习 MVC,我在参加在线类(class)时遇到了一些问题,希望您能帮助我。
我看到了以下示例:
public ActionResult Search()
{
var context = new DBFeedbackContext();
ViewBag.CMC = context.Categories.Select(x => new SelectListItem() { Text = x, Value = x.Id.ToString() }).ToList();
return View();
}
并且在类(class)中被告知“这不是您在实际应用程序中执行此操作的方式,您将通过依赖注入(inject)在 Controller 构造函数中调用数据库,但对于这个简单的示例,这就足够了”。
然后他离开了这个话题,再也没有回到这个话题上。
我想知道他在说什么,你们会怎么做,你们能帮忙吗?
这是完全正确的做事方式。我在这里看到的唯一问题是什么上下文没有被处置。你应该这样写:
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();
}
}
依赖注入(inject)并不是万能的“金锤子”。我想他想说的是你应该为每个 Controller / session 创建数据库连接,这样你确实最好做这样的事情:
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(){ ... }
}
这样您就可以将上下文生命周期的创建和管理委托(delegate)给您的 Controller 外部,因为它完全超出了您的 Controller 解决的任务范围。大多数情况下,您甚至不关心它是如何创建/处置的,您只需要它,仅此而已。
尽管如此,如果您不断创建上下文,在大多数用例中并没有什么坏处,它们只是在连接池中获取/返回,没有别的。