Hangfire 作业过滤器中的范围服务

Scoped service in Hangfire Job Filter

在搜索和阅读可能与所讨论主题相关的所有讨论之后,似乎没有明确(甚至不清楚) 对此的解决方案。

我有一个工作过滤器,我想将它应用到每一个工作。我想做的是:当作业失败时(转到 FailedState,当最大重试次数超过或手动抛出该状态时会发生这种情况),我想记录一条自定义的、用户友好的异常消息到数据库(我的自定义 table)。

public class WorkflowJobFailureAttribute : JobFilterAttribute, IApplyStateFilter {

    public WorkflowJobFailureAttribute(IServiceProvider serviceProvider) {
        // Getting my required services here
    }

    public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction) 
    {
        var failedState = context.NewState as FailedState;
        if (failedState != null) {
            // - HANDLE FAILED STATE HERE -
                
            // You can get the exception (which is of type `Exception`) using: `failedState.Exception`
        }
    }
}

但我的每一天 example/suggestion 都是在全局注册过滤器(GlobalJobFilters.Filters.Add(new WorkflowJobFailureAttribute(serviceProvider));Startup.cs 中)。但这是 ROOT 服务提供者,因此它不适用于作用域生命周期。

'workaround' balazs hideghety 在评论 here 中提出了一个可能 'workaround'。但在深入研究之前(因为它感觉像是一个 'distant' 解决方案),我想知道:根据他的经验,有没有人解决了这个问题?

注入作用域服务提供者工厂,然后根据需要创建作用域服务提供者

public class WorkflowJobFailureAttribute : JobFilterAttribute, IApplyStateFilter {
    private readonly IServiceScopeFactory scopeFactory;

    public WorkflowJobFailureAttribute(IServiceScopeFactory scopeFactory) {
        this.scopeFactory = scopeFactory; 
    }

    public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction) {
        var failedState = context.NewState as FailedState;
        if (failedState != null) {
            using (IServiceScope scope = scopeFactory.CreateScope()) {
                IServiceProvider serviceProvider = scope.ServiceProvider;

                // Getting my required services here

                // - HANDLE FAILED STATE HERE -
                
                // You can get the exception (which is of type `Exception`) using: `failedState.Exception`
            }
        }
    }
}

在前面的代码中,创建了一个显式范围,服务提供者可用于解析范围内的服务。