Как создать задание, подобное cron, с помощью HangFire при запуске?

#.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:

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-6.0#resolve-a-service-at-app-start-up

     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);
    }