c# - 通过注入(inject)在构造函数中创建数据库调用

标签 c# asp.net asp.net-mvc

<分区>

我正在学习 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 解决的任务范围。大多数情况下,您甚至不关心它是如何创建/处置的,您只需要它,仅此而已。

尽管如此,如果您不断创建上下文,在大多数用例中并没有什么坏处,它们只是在连接池中获取/返回,没有别的。

关于c# - 通过注入(inject)在构造函数中创建数据库调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42606383/

相关文章:

c# - SelectSingleNode 似乎在搜索 parent 和 sibling

c# - 使用 MonoTouch 的异步请求

asp.net - MVC/ASP.NET设计模板

c# - asp net mvc 5 中的授权帮助

c# - 如何将项目添加到 PayPal API 中的项目列表

c# - 使用 Coredll.dll 检索商店信息

c# - 如何选择包含特定关键字的表 - c# - xpath - htmlagilitypack

asp.net-mvc - MVC Mini-Profiler 修改 RouteCollection 时抛出 LockRecursionException

c# - 如何创建 Asp.net mvc 安全登录页面身份验证?

c# - 在 Asp.Net MVC 5 中实现多个数据库的最佳实践是什么?