在新的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中的所有控制器中都有上下文?
使用依赖注入。 Ninject,Unity等。
通常在ASP.NET MVC中,我可以通过使用New ReportDbContext
().。。
您也可以这样做,即现在在控制器中显式地创建一个新的上下文。 除了最佳实践之外,没有任何东西可以阻止您这样做。
使用依赖项注入的一些好处是,您可以在startup
类中定义依赖项的生存期,并在所有控制器中重用它,还可以在单元测试中模拟依赖项。 有关更多信息,请参阅文档和本问题。
但是如果您不想或有理由不这样做,您当然不必使用依赖注入。 编译器不会强制您定义一个接受依赖项的自定义构造函数。
ASP.NET核心的体系结构是建立在依赖注入的基础上的。 它甚至有一个内置的依赖注入容器,但您也可以使用其他的,如AutoFac或Ninject。 如果您需要在多个操作中使用DbContext,可以使用构造函数注入,如您的示例所示。
如果只需要一次,可以像这样直接注入到动作方法中:
public IActionResult Get([FromServices]ReportDbContext db)
{
…
}
依赖注入的使用使您的代码更具可测试性。 对于单元测试,可以注入InMemory DbContext。