使用 Hangfire 在服务子对象中执行方法
Execute method in service sub object with 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());
但是它很难看所以你知道正确的方法吗?
根据,Hangfire 任务被序列化为单个方法调用。你不能写出那样复杂的表达式;根本不支持。
您可以通过编写一个方法并直接调用它来解决这个问题,如下所示:
class MyService : IService
{
public void DoWhatIWant()
{
this.SubObject.MyPublicMethodAsync();
}
}
BackgroundJob.Enqueue<IService>( s => s.DoWhatIWant() );
我想使用 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());
但是它很难看所以你知道正确的方法吗?
根据
您可以通过编写一个方法并直接调用它来解决这个问题,如下所示:
class MyService : IService
{
public void DoWhatIWant()
{
this.SubObject.MyPublicMethodAsync();
}
}
BackgroundJob.Enqueue<IService>( s => s.DoWhatIWant() );