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`
}
}
}
}
在前面的代码中,创建了一个显式范围,服务提供者可用于解析范围内的服务。
在搜索和阅读可能与所讨论主题相关的所有讨论之后,似乎没有明确(甚至不清楚) 对此的解决方案。
我有一个工作过滤器,我想将它应用到每一个工作。我想做的是:当作业失败时(转到 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`
}
}
}
}
在前面的代码中,创建了一个显式范围,服务提供者可用于解析范围内的服务。