#.net #asp.net-core #hangfire
#.net #asp.net-core #hangfire
Вопрос:
У меня есть класс службы, в котором есть метод, подобный
public void BackgroundJob(string cronrule)
{
RecurringJob.AddOrUpdate("somejob", () => FetchCallHistoryAsync(), cronrule);
}
Я хочу запустить задание в автозагрузке, что-то вроде этого
public void ConfigureServices(IServiceCollection services)
{
...
new MyClass().BackgroundJob("10 * * * *")
}
Но мой класс зависит от нескольких других сервисов, я не знаю, как создать его из Startup.cs, есть идеи?
Ответ №1:
Хорошо, я нашел способ
В любых случаях, когда вам необходимо создать экземпляр службы при запуске, вы регистрируете ее в ConfigureServices(IServiceCollection services)
, а затем внедряете в Configure(YourService yserv)
Для моего особого случая я создал CrontabService
namespace MyApp
{
public class CrontabService
{
private DependentService D;
public CrontabService(DependentService d)
{
D = d
}
public Start()
{
RecurringJob.AddOrUpdate("some-id", () => D.Job(), "*/15 * * * *");
}
}
}
Таким образом, все мои задания crontab остаются в одной службе.
Затем я запускаю его в Startup.cs::Configure
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSingleton<DepedentService>();
services.AddSingleton<CrontabService>();
}
...
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, CrontabService cron)
{
...
cron.Start();
...
}
...
Комментарии:
1. Просто здесь, чтобы сказать, что ваш вопрос и исследование помогли этому скромному программисту
2. Спасибо, я рад, что это сработало 🙂
Ответ №2:
Для asp.net ядро 6:
var app = builder.Build();
using (var serviceScope = app.Services.CreateScope())
{
var services = serviceScope.ServiceProvider;
var jobService = services.GetRequiredService<IJobsService>();
RecurringJob.AddOrUpdate("Shred Old Records", () => jobService.AutoShredOldReports(), Cron.Weekly);
}