使用loc在HangFire中实现重复作业
本文关键字:作业 实现 loc HangFire 使用 | 更新日期: 2023-09-27 18:26:12
我有我的webApi,我想设置定期作业。我应该把代码放在哪里?此外,由于我使用的是SimpleInjector,我如何获得执行该方法所需的服务?
目前我有我的扩展方法来设置HangFire,就像一样
public static IApplicationBuilder UseHangFireServer(this IApplicationBuilder builder, Container container, BackgroundJobServerOptions options, JobStorage storage)
{
if (builder == null) throw new ArgumentNullException("builder");
if (options == null) throw new ArgumentNullException("options");
if (storage == null) throw new ArgumentNullException("storage");
var server = new BackgroundJobServer(options, storage);
var lifetime = builder.ApplicationServices.GetRequiredService<IApplicationLifetime>();
lifetime.ApplicationStopped.Register(server.Dispose);
RecurringJob.AddOrUpdate("run-triggers", () => { "HERE I NEED A SERVICE, USING SIMPLE INJECTOR?" }, Cron.Hourly);
return builder;
}
我试过使用这个
RecurringJob.AddOrUpdate("run-triggers", () => container.GetInstance<IMyService>().Run(), Cron.Hourly);
但我收到错误消息说
IMyService注册为"Execution Context Scope"生活方式,但是该实例是在执行上下文之外请求的上下文范围。
我也试过
RecurringJob.AddOrUpdate("trigger-queue", () => builder.ApplicationServices.GetService<IMyService>().Queue(), Cron.Hourly);
但这将返回null。
您似乎需要为Hangfire设置一个新的作业激活器,以便它能够提供依赖项。(默认情况下不会处理依赖项)。
您可以使用已编写的简单注射器激活器:https://www.nuget.org/packages/HangFire.SimpleInjector(或查看来源并编写自己的)
然后,您可以查看以进行设置(设置传递到作业服务器的选项实例的activator属性):http://docs.hangfire.io/en/latest/background-methods/using-ioc-containers.html
(不确定这些外部链接是否正常,我觉得如果它们从互联网上消失,Hangfire很可能也会消失)。
现在,您可以为重复作业创建一个类,Hangfire将使用激活器为构造函数提供依赖项。
IE:
class SomeJob {
myDependency _param1;
public SomeJob(myDependency param1) {
_param1 = param1;
}
void ExecuteTask() {
_param1.DoStuff();
}
}
然后你可以:
RecurringJob.AddOrUpdate((j)=>j.Execute(),Cron.Hourly);
Hangfire将使用type参数创建类的实例,使用简单的注入器将依赖项提供给ctor,然后它将执行您的作业。
希望这是有用的
Steve