【问题标题】:Initizlizing a DbContext in a BaseController for MVC6 and EF7?在 MVC 6 和 EF7 的基本控制器中初始化 DbContext?
【发布时间】:2023-03-25 18:14:01
【问题描述】:

按照ASP.Net 5 Getting Started 文档,我看到因为dependency injection 在任何将访问数据库的控制器的顶部,我需要放置类似的东西

private DbContext _Context;

public HomeController(DbContext Context)
{
      _Context = Context;
}

将 DbContext 注入到控制器中以供使用。在我的 ASP.Net 5 MVC 6 Web 应用程序中,每个页面都将与数据库交互,所以我想我会创建一个 BaseController,我的控制器的重置将从那里继承并将注入代码放在那里。我已经这样做了,但是从BaseController 继承的每个控制器都会给我错误

没有给出与 'BaseController.BaseController(DbContext) 的所需形参 'Context' 对应的参数

我是 DI 的新手,不确定我做的事情是否正确,或者是否可以按照我想要的方式完成。是否可以这样做,或者我是否必须将该代码放在我制作的每个控制器上,如果我必须这样做,我如何在BaseController 中编写与数据库交互的操作?

【问题讨论】:

    标签: dependency-injection asp.net-core asp.net-core-mvc entity-framework-core


    【解决方案1】:

    如果您的基控制器有一个采用 DbContext 的构造函数,那么任何继承它的控制器也必须使用相同的构造函数,这样它才能将依赖项传递给基类:

    public HomeController(DbContext Context):base(Context)
    {
    
    }
    

    【讨论】:

    • 我添加了您的代码,错误消失了,但我做的_DbContext 无法从HomeController 访问
    • 您需要在基本控制器中声明为受保护,以便允许家庭控制器使用它。
    • 我自己,我建议不要使用这样的基本控制器,并且我不会直接通过控制器使用 dbcontext。相反,我将有一些服务类来包装 dbContext 并公开控制器进行数据操作所需的方法,而无需直接访问 dbcontext。所以控制器需要注入服务类,服务类需要注入 dbcontext。
    • 我不明白你的意思,除了我在自己的项目中学到的知识之外,我并没有太多的接触,只是几年的 jr。开发商。在一个月前我开始使用 .Net 5 之前,DI 对我来说是全新的。
    • 基本控制器没有提供任何好处,除非它具有其他功能,因为派生控制器仍然需要依赖于 dbcontext。最好在 UI(控制器)和数据层之间有一个抽象层,而不是直接使用 dbcontext
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多