gpt4 book ai didi

asp.net-core - .NET CORE Lifetime 和 DI 注入(inject)的后台任务

转载 作者:行者123 更新时间:2023-12-03 08:13:23 30 4
gpt4 key购买 nike

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

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

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

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

另一件事是后台工作人员中的 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() 添加的所有托管服务实际上添加了单例生命周期,确保永远只有一个实例。

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

我详细介绍了服务范围in this recent answer to a similar question如果您有兴趣。

关于asp.net-core - .NET CORE Lifetime 和 DI 注入(inject)的后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70181860/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com