使用接口排队的Hangfire作业会忽略类/方法级别上的指定作业过滤器

时间:2018-02-15 07:32:57

标签: hangfire

考虑我们有以下课程:

[AutomaticRetry(Attempts = 3)]
public class EmailSender : IEmailSender
{
    [ErrorReporting(Attempts = 1)]
    public async Task Send()
    {
    }
}

public interface IEmailSender
{
    Task Send();
}

我们以这种方式排队:

backgroundJobClient.Enqueue<IEmailSender>(s => s.Send());

提一下,我使用的是SimpleInjector及它的Hangfire工作激活器。

首先考虑来自Attempts属性的AutomaticRetry属性。说到ErrorReporting自定义属性,它根本不会被执行。

看起来Hangfire只在已注册的类型(我的情况下是接口)上检查已定义的属性,而不是将要解析的实例类型。

在我的情况下,IEmailSender在单独的项目中定义。我相信一个解决方案是将它与EmailSender和自定义属性实现保持在一起,再加上接口级别的定义属性,但我不想这样做,因为我的Hangfire作业是在Windows服务中处理的并且作业本身由客户端(使用接口)排队,因此客户无需了解任何有关实现的信息。

你知道如何以一种好的方式解决这个问题吗?我们可以在Windows服务中创建BackgroundJobServer时以某种方式配置这些过滤器吗?

1 个答案:

答案 0 :(得分:1)

我用这种方式解决了它: https://gist.github.com/rwasik/80f1dc1b7bbb8b8a9b47192f0dfd4664

如果您有任何其他想法,请告诉我。

相关问题