考虑我们有以下课程:
[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
时以某种方式配置这些过滤器吗?
答案 0 :(得分:1)
我用这种方式解决了它: https://gist.github.com/rwasik/80f1dc1b7bbb8b8a9b47192f0dfd4664
如果您有任何其他想法,请告诉我。