我有一个服务,其中有一些方法,我希望它们成为循环作业。
我知道我可以在我的Startup.cs中使用Hangfire,例如:
RecurringJob.AddOrUpdate(() => Console.WriteLine("I'm a recurring job"), Cron.Minutely);
但问题是我该如何在这里使用我的服务?我应该在这里使用某种方式(依赖注入?)还是在其他地方使用?
也许我应该将一些 cron 值放到 appsettings.json 中?
我有一个服务,其中有一些方法,我希望它们成为循环作业。
我知道我可以在我的Startup.cs中使用Hangfire,例如:
RecurringJob.AddOrUpdate(() => Console.WriteLine("I'm a recurring job"), Cron.Minutely);
但问题是我该如何在这里使用我的服务?我应该在这里使用某种方式(依赖注入?)还是在其他地方使用?
也许我应该将一些 cron 值放到 appsettings.json 中?
你的意思是这样的吗?
RecurringJob.AddOrUpdate<IAlertService>(x =>
x.SendAlerts(emailSettings, link), Cron.MinuteInterval(1));
以下是如何从启动文件调用Hangfire服务。在我的情况下,我将IMediator作为我的服务构造函数。你可能还有一个或多个其他的构造函数可以添加到AddTransient中。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages()
.AddRazorRuntimeCompilation()
.AddMvcOptions(options => options.EnableEndpointRouting = false);
serviceCollection.AddTransient<INotificationSchedulerService>
(
serviceProvider => new NotificationSchedulerService
(
serviceProvider.GetService<IMediator>()
)
);
services.AddHangfire(x => x.UseSqlServerStorage("Server=SQLEx\\SQLSERVER2019;Database=Tempdatabase;User ID=sa;Password=xuz@de5234;MultipleActiveResultsets=true"));
services.AddHangfireServer();
}
public void Configure(IApplicationBuilder applicationBuilder, IWebHostEnvironment hostEnvironment)
{
RecurringJob.AddOrUpdate<INotificationSchedulerService>(x => x.ScheduleLikeNotifications(),"*/2 * * * *");
}
}
我来晚了一年,偶然发现这个问题,当时正在寻找与Hangfire相关的东西,想回答一下,因为没有回答这个问题。
您绝对可以在Hangfire中使用依赖注入,而无需依赖默认构造函数或在类内实例化。
您可以从JobActivator
继承并覆盖ActivateJob(Type)
方法,同时您的自定义实现使用IServiceProvider
。
public class DependencyJobActivator : JobActivator
{
private readonly IServiceProvider _serviceProvider;
public DependencyJobActivator(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public override object ActivateJob(Type jobType) {
return _serviceProvider.GetService(jobType);
}
}
然后只需在 Startup 类的 Configure
方法中告诉 Hangfire 使用您的自定义实现即可。
public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
app.UseHangfireDashboard();
app.UseHangfireServer(new BackgroundJobServerOptions { Activator = new DependencyJobActivator(serviceProvider) });
app.UseMvc();
}
RecurringJob.AddOrUpdate("MyMethodNameAsID", () => Class.Method(), Cron.Minutely);
我认为这个应该可以运行...也许。如果我正确理解了你的问题的话。 - NooGuy