.NET CORE Lifetime 和 DI 注入的后台任务
Posted
技术标签:
【中文标题】.NET CORE Lifetime 和 DI 注入的后台任务【英文标题】:Background tasks with .NET CORE Lifetime and DI injection 【发布时间】:2022-01-07 21:44:54 【问题描述】:我想在 asp.net core 中使用后台任务。 我找到了有用的文档https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-6.0&tabs=visual-studio
我想知道为什么它们的生命周期显然是作用域:激活作用域服务的托管服务。作用域服务可以使用依赖注入 (DI)。 在这种情况下,什么是范围?
对于 Web 应用程序,范围生命周期表示每个客户端请求(连接)创建一次服务。使用 AddScoped 注册范围服务。 在处理请求的应用中,作用域服务在请求结束时被释放。
虽然我确实理解这对于例如标准的 http get 请求到 api 意味着什么, 我不明白后台工作人员的含义。 恕我直言,拥有一个单身背景工作者会更有意义。我当然不希望在我的应用程序中同时运行多个实例。
另一件事是后台工作人员中的 DI,这显然不同于标准服务: 要在 BackgroundService 中使用范围服务,请创建一个范围。默认情况下不会为托管服务创建范围。
我无法确认:
services.AddHostedService(x => new DataPersister(x.GetRequiredService<IAsyncDocumentSession>(), x.GetRequiredService<ILogger>()));
似乎工作得很好。
【问题讨论】:
【参考方案1】:您必须在完整的上下文中阅读“激活范围服务的托管服务”这句话:
本文提供了三个托管服务示例:
在计时器上运行的后台任务。 激活作用域服务的托管服务。作用域服务可以使用依赖注入 (DI)。 按顺序运行的排队后台任务。(来自“Background tasks with hosted services”,强调我的)
因此,托管服务并非具有范围生命周期。使用AddHostedService()
添加的所有托管服务实际上都以singleton 生命周期添加,确保永远只有一个实例。
本文所指的是当您需要在托管服务中使用范围服务(如数据库连接)时的情况。由于您无法将作用域依赖项注入到单例服务中,因此您将需要一个不同的解决方案。解决方案通常涉及让单例服务(在本例中为托管服务)自己创建一个服务范围,然后它可以从中检索范围内的依赖项。
如果您有兴趣,我会详细介绍服务范围in this recent answer to a similar question。
【讨论】:
文档确实应该清楚地表明它是一个单身人士,正如我所预料的那样。以上是关于.NET CORE Lifetime 和 DI 注入的后台任务的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)
ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)
ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)