提问者:小点点

有没有更好的方法将dbcontext添加到ASP.Core MVC控制器中?


在新的MVC核心中,将上下文获取到控制器的标准方法似乎是这样做的

public class BaseController : Controller
    {

        public readonly ReportDBContext _db;

        public BaseController(ReportDBContext db)
        {
            _db = db;
        }
}

然后我可以使用

public class HomeController : BaseController
    {

        public HomeController(ReportDBContext db) : base(db) { }
}

以便在所有其他控制器中更容易实现这一点。 通常在ASP.NET MVC中,我可以通过使用New ReportDBContext()随时获取上下文

现在是否有类似的方式,或者我必须在ASP.Core MVC中的所有控制器中都有上下文?


共3个答案

匿名用户

使用依赖注入。 Ninject,Unity等。

匿名用户

通常在ASP.NET MVC中,我可以通过使用New ReportDbContext().。。

您也可以这样做,即现在在控制器中显式地创建一个新的上下文。 除了最佳实践之外,没有任何东西可以阻止您这样做。

使用依赖项注入的一些好处是,您可以在startup类中定义依赖项的生存期,并在所有控制器中重用它,还可以在单元测试中模拟依赖项。 有关更多信息,请参阅文档和本问题。

但是如果您不想或有理由不这样做,您当然不必使用依赖注入。 编译器不会强制您定义一个接受依赖项的自定义构造函数。

匿名用户

ASP.NET核心的体系结构是建立在依赖注入的基础上的。 它甚至有一个内置的依赖注入容器,但您也可以使用其他的,如AutoFac或Ninject。 如果您需要在多个操作中使用DbContext,可以使用构造函数注入,如您的示例所示。

如果只需要一次,可以像这样直接注入到动作方法中:

public IActionResult Get([FromServices]ReportDbContext db) 
{ 
   …
} 

依赖注入的使用使您的代码更具可测试性。 对于单元测试,可以注入InMemory DbContext。