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

时间:2018-02-15 16:19:06

标签: c# asp.net-core dependency-injection hangfire

我想在Hangfire的后台启动服务的子对象中的方法。所以这就是我的工作。

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

但它引发了一个例外,因为MyPublicMethodAsync位于SubObject而不是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());

但它非常难看,所以你知道这样做的正确方法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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