使用 Hangfire 在服务子对象中执行方法

Execute method in service sub object with Hangfire

我想使用 Hangfire 在后台服务的子对象中启动一个方法。所以这就是我所做的。

BackgroundJob.Enqueue<IMyService>(myService => myService.SubObject.MyPublicMethodAsync());

但它抛出异常,因为 MyPublicMethodAsyncSubObject 而不是 IMyService 因为 HangFire 中的验证码:

  if (!method.DeclaringType.GetTypeInfo().IsAssignableFrom(type.GetTypeInfo()))
            {
                throw new ArgumentException(
                    $"The type `{method.DeclaringType}` must be derived from the `{type}` type.",
                    typeParameterName);
            }

https://github.com/HangfireIO/Hangfire/blob/master/src/Hangfire.Core/Common/Job.cs(第 391 行)

我目前的解决方法是:

public Task DoWhatIWant()
        {
            return _myService.SubObject.MyPublicMethodAsync();
        }

BackgroundJob.Enqueue(() => DoWhatIWant());

但是它很难看所以你知道正确的方法吗?

根据,Hangfire 任务被序列化为单个方法调用。你不能写出那样复杂的表达式;根本不支持。

您可以通过编写一个方法并直接调用它来解决这个问题,如下所示:

class MyService : IService
{
    public void DoWhatIWant()
    {
        this.SubObject.MyPublicMethodAsync();
    }
}

BackgroundJob.Enqueue<IService>( s => s.DoWhatIWant() );