Hangfire 作业中的范围依赖项

问题描述 投票:0回答:1

我在 .Net 7 应用程序中使用 Hangfire 来运行 Fire and Forget 作业。 在文档中,它说只允许 Transient 或 Singleton 依赖项。然而,文档似乎已经“过时了”,因为它们需要使用“JobActivator”,但现在不再需要了。我在作业中连接了作用域依赖项。这些 Scoped 依赖项甚至还有其他正在使用的 Scoped 依赖项。而且它有效。

但我对进一步的潜在问题有疑问:

hangfire 会在作业完成后处理该作用域对象吗?还是会泄漏到内存中?我需要手动处置作用域依赖项吗?

我在互联网上爬取了很多关于这个问题的信息,但似乎要么过时了,要么没有明确的答案。

让我担心这个问题的是这个

问题

它说的地方

这是错误的实现,不应使用。有一个 作业激活器具有这些 BeginScope 函数的原因。唯一的办法 在这里使用这个实现就是将根服务传递给它 提供者。这意味着它永远不会被处理,意味着每次你 创建一个作业,您会泄漏创建的所有依赖项。

.net-core .net-7.0 hangfire
1个回答
0
投票
Hangfire.NetCore

并像这样注册您的hangfire:

services.AddHangfire(c => c
    .UseSimpleAssemblyNameTypeSerializer()
    .UseRecommendedSerializerSettings()
    .UseConsole()
    ,new SqlServerStorageOptions()));

那么是的,因为在幕后
Hangfire.NetCore

使用依赖于

AspNetCoreJobActivator
IServiceScopeFactory
BeginScope
方法返回
AspNetCoreJobActivatorScope
实例,该实例依赖于从“IServiceScopeFactory”创建范围的
IServiceScope
如果您查看 

CoreBackgroundJobPerformer

,它会在 
JobActivator 语句中使用
using
,因此所有内容都将在 using 语句的末尾进行处理。

所以简而言之,每一项悬火工作都是一个范围。

© www.soinside.com 2019 - 2024. All rights reserved.