.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()
添加的所有托管服务实际上都添加了 单例 生命周期,确保永远只有一个实例。
本文所指的是您需要在托管服务中使用范围服务(如数据库连接)的情况。由于您不能将作用域依赖项注入单例服务,因此您需要一个不同的解决方案。解决方案通常涉及让单例服务(在本例中为托管服务)本身创建一个服务范围,然后可以从中检索范围内的依赖项。
如果您有兴趣,我会详细介绍服务范围。
我想在 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()
添加的所有托管服务实际上都添加了 单例 生命周期,确保永远只有一个实例。
本文所指的是您需要在托管服务中使用范围服务(如数据库连接)的情况。由于您不能将作用域依赖项注入单例服务,因此您需要一个不同的解决方案。解决方案通常涉及让单例服务(在本例中为托管服务)本身创建一个服务范围,然后可以从中检索范围内的依赖项。
如果您有兴趣,我会详细介绍服务范围