gpt4 book ai didi

c# - 如何将 dbcontext/工作单元发送到 Hangfire 作业过滤器

转载 作者:行者123 更新时间:2023-12-03 08:55:22 25 4
gpt4 key购买 nike

我们使用 Hangfire 来执行一些夜间和长时间运行的作业,并且我们正在单独的数据库中跟踪每个作业的其他相关详细信息/元数据,以避免将来出现 Hangfire 升级问题。作业过滤器 ( https://docs.hangfire.io/en/latest/extensibility/using-job-filters.html ) 将帮助我们以更轻松的方式跟踪每个作业的状态,但我找不到如何将依赖项发送到作业过滤器的示例。

我们正在使用依赖注入(inject) (DI) 和存储库 + 工作单元模式运行 ASP.NET Core。

我如何能够从作业过滤器内访问数据库上下文(或工作单元,或通过 DI 可用的任何其他项目)?

谢谢

编辑我创建了一个包含一个小示例项目的存储库,该项目概述了我在这里尝试执行的操作: https://github.com/joelpereira/hfjobfilter/tree/master/HFJobFilter

它可以编译,但出现错误: .UseFilter(new TypeFilterAttribute(typeof(LogToDbAttribute)))

最佳答案

从我的想法来看,您可以尝试将 JobFilter 添加为 TypeFilter它会自动注入(inject)依赖项(如果您的 LogEverythingAttribute 的构造函数中有任何依赖项),因此请从您提供的链接修改示例:

public class EmailService
{
[TypeFilter(typeof(LogEverything))]
public static void Send() { }
}

GlobalJobFilters.Filters.Add(new TypeFilterAttribute(typeof(LogEverythingAttribute())));

免责声明:我自己还没有测试过上述内容,所以请告诉我这是否有效。

已编辑

尝试在 ConfigureServices 中配置 Hangfire,看看是否有效

services.AddHangfire(config =>
{
config.UseFilter(new TypeFilterAttribute(typeof(LogToDbAttribute)));

// if you are using the sqlserverstorage, uncomment the line and provie
// the required prameters
// config.UseSqlServerStorage(connectionString, sqlServerStorageOptions);
});

更新答案

请查看changes我已经按照您提供的代码进行了修改。我已经测试过它并且它有效。下面有几点需要注意。

请查看我如何使用利用 HttpClientFactory 和类型化客户端的 AddHttpClient 方法来注册 HttpClient。这是使用 HttpClient 的推荐方式。您可以阅读更多相关信息here

services.AddHttpClient<HfHttpClient>(client =>
{
client.BaseAddress = new Uri("http://localhost:44303");

// you can set other options for HttpClient as well, such as
//client.DefaultRequestHeaders;
//client.Timeout
//...
});

此外,您还需要注册 LogDbAttribute,然后使用 IServiceProvider 在 UseFilter 调用中解析它

// register the LogToDbAttribute
services.AddSingleton<LogToDbAttribute>();
// build the service provider to inject the dependencies in LogDbAttribute
var serviceProvider = services.BuildServiceProvider();
services.AddHangfire(config => config
.UseSqlServerStorage(Configuration.GetConnectionString("HangfireDBConnection"))
.UseFilter(serviceProvider.GetRequiredService<LogToDbAttribute>()));

我还注入(inject)了 ILogger 以证明它正在工作。由于某种原因,如果您尝试使用 HttpClient 执行任何操作,它就会挂起。也许,原因是它是一个后台作业,并且所有 HttpClient 调用都是异步的,因此它不会返回,并且两个进程试图互相等待。

如果您打算注入(inject) HttpClient,您可能需要研究一下。不过,记录器工作正常。

此外,您不需要从 TypeFilterAttribute 继承 LogDbAttribute。 TypeFilterAttribute 解决方案并不像我最初建议的那样工作。

关于c# - 如何将 dbcontext/工作单元发送到 Hangfire 作业过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55869831/

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