为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
莫回无 2022-12-31 12:51:36
我们正在将 Hangfire 用于一些夜间和长时间运行的作业,并且我们正在单独的数据库中跟踪每个作业的其他相关详细信息/元数据,以避免将来出现 Hangfire 升级问题。工作过滤器 ( https://docs.hangfire.io/en/latest/extensibility/using-job-filters.html ) 将帮助我们以更容易的方式跟踪每个工作的状态,但我找不到如何将依赖项发送到作业过滤器的示例。我们正在运行带有依赖注入 (DI) 和存储库 + 工作单元模式的 ASP.NET Core。我如何才能从作业过滤器中访问数据库上下文(或工作单元,或任何其他可通过 DI 获得的项目)?谢谢编辑 我创建了一个存储库,其中包含一个小示例项目,概述了我在这里尝试做的事情: https ://github.com/joelpereira/hfjobfilter/tree/master/HFJobFilter它编译但在行上有错误:.UseFilter(new TypeFilterAttribute(typeof(LogToDbAttribute)))
查看完整描述

1 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

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


public class EmailService

{

    [TypeFilter(typeof(LogEverything))]

    public static void Send() { }

}


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

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


已编辑


尝试像下面这样配置 Hangfire ConfigureServices,看看是否可行


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);

});

更新的答案


请查看我对您提供的代码所做的更改。我已经对其进行了测试并且可以正常工作。下面几点需要注意。


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


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,然后在 UseFilter 调用中解析它,使用IServiceProvider


// 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>()));

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


如果您打算注入 HttpClient,您可能需要调查一下。但是,记录器工作正常。


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


查看完整回答
反对 回复 2022-12-31
  • 1 回答
  • 0 关注
  • 47 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信