何时在 ASP.NET Core 5 中处理 DbContext 实例

Dal*_*ser 3 c# entity-framework-core asp.net-core .net-5

我正在使用推荐的方法来创建 DbContext通过依赖注入实例。

在 Startup.cs -

services.AddDbContext<DashboardContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DashboardConnection")));
Run Code Online (Sandbox Code Playgroud)

并在控制器中 -

private readonly DashboardContext db;
public AccountController(DashboardContext context)
{
    db = context;
}
Run Code Online (Sandbox Code Playgroud)

我想知道的是这个实例什么时候被处理掉。

以前我们总是使用在using大括号结束时处理的语句 -

using (DashboardContext db = new DashboardContext())
{
    // Query
}
Run Code Online (Sandbox Code Playgroud)

ati*_*yar 6

使用该AddDbContext方法,DbContext将创建一个Scoped默认情况下生命周期的a;这意味着,它的生命周期在当前请求范围内,一旦当前请求完成,它就会被处理掉。

但是您可以通过为contextLifetime参数传递一个值来覆盖默认值,例如 -

services.AddDbContext<DashboardContext>(options => 
    options.UseSqlServer(
        Configuration.GetConnectionString("DashboardConnection")),
        ServiceLifetime.Transient);
Run Code Online (Sandbox Code Playgroud)

进一步的细节检查 - AddDbContext

编辑 - (回复@Dale 的评论):
考虑到 ASP.NET Core MVC 的整体架构,以及我们如何倾向于使用该框架,我会说(个人意见)一般来说,对于大多数应用程序来说,最好坚持到默认Scoped生命周期。
在回答中,我只是想明确说明手动配置选项适合您。当然,可能存在手动配置使用的用例或场景(取决于您如何设计自己的应用程序)。

  • @DaleFraser 假设控制器依赖于 IBob 和 ICathy。Cathy(ICathy)也依赖于 IBob。您希望控制器和 Cathy 共享同一个 IBob 吗?如果是这样 - IBob 应该被划定范围。如果不是 - IBob 应该是瞬态的。_处置方面 - Transient 和 Scoped 的行为相同,当网络请求结束时,它们将“Dispose”。_我认为大多数_场景“Transient”是更安全的默认值。 (2认同)