Hangfire自定义JobFilter特性参数如何从appsettings.json读取配置
Hangfire 没有内置支持特性参数自动解析配置占位符的能力,你可以通过改造自定义过滤器的内部逻辑实现需求,不需要改动你期望的特性标注用法。
实现思路
利用 Hangfire 过滤器上下文可以直接获取 DI 容器中服务的能力,在过滤器执行逻辑中对传入的参数做占位符解析,从IConfiguration读取对应的配置值。
具体实现代码
1. 改造MyJobAttribute
public class MyJobAttribute : JobFilterAttribute, IServerFilter { private readonly string _configKeyOrValue; public MyJobAttribute(string configKeyOrValue) { _configKeyOrValue = configKeyOrValue; } public void OnPerforming(PerformingContext context) { // 从DI容器获取配置服务 var configuration = context.GetService<IConfiguration>(); var actualConfigValue = ResolveConfigValue(configuration, _configKeyOrValue); // 解析后的配置值存入上下文,避免OnPerformed重复解析 context.Items["MyJob_ConfigValue"] = actualConfigValue; // 此处替换为你原有OnPerforming的逻辑,直接使用actualConfigValue即可 // ... } public void OnPerformed(PerformedContext context) { // 直接从上下文取已经解析好的配置值 var actualConfigValue = context.Items["MyJob_ConfigValue"] as string; // 此处替换为你原有OnPerformed的逻辑 // ... } /// <summary> /// 解析配置值,%包裹的内容会作为配置键从appsettings中读取 /// </summary> private string ResolveConfigValue(IConfiguration configuration, string input) { if (string.IsNullOrWhiteSpace(input)) return input; // 匹配%key%格式的配置键 if (input.StartsWith('%') && input.EndsWith('%')) { var configKey = input.Trim('%'); // 找不到对应配置时兜底返回原始输入 return configuration[configKey] ?? input; } // 非占位符格式直接返回原值,兼容原有硬编码写法 return input; } }
2. 标注特性
和你期望的写法完全一致:
[MyJob("%thekey%")] public void Test() { // Do the job }
3. 配置appsettings.json
{ "thekey": "very important string" }
兼容说明
该实现兼容原有硬编码参数的写法,如果你某个任务不需要读配置,直接写固定值即可正常工作:
[MyJob("fixed config value")] public void AnotherJob() { // ... }
内容的提问来源于stack exchange,提问作者ThomasArdal
相关产品推荐
相关产品推荐

