C# 通过注入在构造函数中创建DB调用

C# 通过注入在构造函数中创建DB调用,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我正在学习MVC,我在参加一个在线课程时遇到了一些问题,希望你能帮我解决 我看到以下示例: public ActionResult Search() { var context = new DBFeedbackContext(); ViewBag.CMC = context.Categories.Select(x => new SelectListItem() { Text = x, Value = x.Id.ToString() }).To

我正在学习MVC,我在参加一个在线课程时遇到了一些问题,希望你能帮我解决

我看到以下示例:

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

        return View();
    }
并在课程中告诉“这不是在实际应用程序中如何实现的,您可以通过依赖项注入在controllers构造函数中调用数据库,但对于这个简单的示例,这就足够了”。 然后他就离开这个话题,再也不谈这个话题了


我想知道他在说什么,你们会怎么做,你们能帮忙吗?

这是完全正确的做事方式。我在这里看到的唯一问题是没有处理什么上下文。你应该这样写:

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(){ ... }
}
通过这种方式,您将能够将上下文生存期的创建和管理委托给控制器外部,因为它完全超出控制器解决的任务范围。你甚至不关心它是如何创建/处理的,你只需要它,仅此而已


虽然,若您不断地创建上下文,那个么在大多数用例中并没有什么坏处,它们只是在连接池中获取/返回,并没有别的

阅读控制反转和依赖注入的概念。这是一个太宽泛的问题,在这里无法回答。