.NET CORE Lifetime 和 DI 注入的后台任务

yBo*_*her 2 backgroundworker asp.net-core

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

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

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

虽然我确实理解这对于例如对 API 的标准 http get 请求意味着什么,但我不理解作为后台工作者的含义。恕我直言,拥有一个单身背景工作者会更有意义。我当然不希望在我的应用程序中同时运行多个实例。

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

我无法确认:

    services.AddHostedService(x => new DataPersister(x.GetRequiredService<IAsyncDocumentSession>(), x.GetRequiredService<ILogger>()));
Run Code Online (Sandbox Code Playgroud)

似乎工作得很好。

pok*_*oke 5

您必须阅读 \xe2\x80\x9cHosted service 这句话,该服务在其完整上下文中激活作用域服务\xe2\x80\x9d :

\n
\n

本文提供了三个托管服务示例

\n
    \n
  • 在计时器上运行的后台任务。
  • \n
  • 激活范围服务的托管服务。作用域服务可以使用依赖项注入 (DI)。
  • \n
  • 按顺序运行的排队后台任务。
  • \n
\n

(来自\xe2\x80\x9c 托管服务的后台任务\xe2\x80\x9d,重点是我的)

\n
\n

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

\n

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

\n

如果您有兴趣,我在最近对类似问题的回答中详细介绍了服务范围。

\n