.NET CORE 生命周期和 DI 注入的后台任务

Background tasks with .NET CORE Lifetime and DI injection

我想在 asp.net 内核中使用后台任务。 我找到了有用的文档 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-6.0&tabs=visual-studio

我想知道为什么它们的生命周期显然是 范围激活范围服务的托管服务。作用域服务可以使用依赖注入 (DI)。 在这种情况下,范围是什么?

对于 Web 应用程序,范围内的生命周期表示每个客户端请求(连接)创建一次服务。使用 AddScoped 注册作用域服务。 在处理请求的应用程序中,作用域服务在请求结束时处理。

虽然我明白这意味着什么,例如对 api 的标准 http get 请求, 我不明白后台工作者的含义。 恕我直言,拥有一个单身背景工作者会更有意义。我当然不想在我的应用程序中一次有多个实例 运行。

另一件事是后台工作人员中的 DI,这显然不同于标准服务: 要在 BackgroundService 中使用范围内的服务,请创建一个范围。默认情况下没有为托管服务创建范围。

我无法确认:

    services.AddHostedService(x => new DataPersister(x.GetRequiredService<IAsyncDocumentSession>(), x.GetRequiredService<ILogger>()));

似乎工作得很好。

您必须在其完整上下文中阅读句子 “激活范围服务的托管服务”

This article provides three hosted service examples:

  • Background task that runs on a timer.
  • Hosted service that activates a scoped service. The scoped service can use dependency injection (DI).
  • Queued background tasks that run sequentially.

(from “Background tasks with hosted services”, emphasis mine)

因此,托管服务的生命周期并非如此。使用 AddHostedService() 添加的所有托管服务实际上都添加了 单例 生命周期,确保永远只有一个实例。

本文所指的是您需要在托管服务中使用范围服务(如数据库连接)的情况。由于您不能将作用域依赖项注入单例服务,因此您需要一个不同的解决方案。解决方案通常涉及让单例服务(在本例中为托管服务)本身创建一个服务范围,然后可以从中检索范围内的依赖项。

如果您有兴趣,我会详细介绍服务范围