using Elsa.Activities.Scheduling.Jobs; using Elsa.Modules.Quartz.Contracts; using Elsa.Modules.Quartz.Jobs; using Elsa.Modules.Quartz.Services; using Elsa.Scheduling.Contracts; using Microsoft.Extensions.DependencyInjection; using Quartz; using IElsaJob = Elsa.Scheduling.Contracts.IJob; namespace Elsa.Modules.Quartz.Extensions; public static class ServiceCollectionExtensions { /// /// This will register both Quartz as well as Elsa-specific services and jobs. /// If you prefer to register Quartz yourself, use /// public static IServiceCollection AddQuartzModule( this IServiceCollection services, Action? configureQuartzOptions = default, Action? configureQuartz = default, Action? configureQuartzHostedService = default) { if (configureQuartzOptions != null) services.Configure(configureQuartzOptions); return services .AddQuartz(configure => { ConfigureQuartz(configure, configureQuartz); ConfigureQuartzModule(services, configure); }) .AddQuartzHostedService(options => ConfigureQuartzHostedService(options, configureQuartzHostedService)); } /// /// This will register Elsa-specific services and jobs, but will **not** register Quartz itself. To register Quartz, you need to do so yourself, or use to register & configure Quartz for Elsa. /// public static IServiceCollection ConfigureQuartzModule(this IServiceCollection services, IServiceCollectionQuartzConfigurator quartz) { services .AddSingleton() .AddSingleton(); quartz.AddElsaJobs(); return services; } private static IServiceCollectionQuartzConfigurator AddElsaJobs(this IServiceCollectionQuartzConfigurator quartz) { quartz.AddJob(); return quartz; } private static void ConfigureQuartzHostedService(QuartzHostedServiceOptions options, Action? configureQuartzHostedService) { options.WaitForJobsToComplete = true; configureQuartzHostedService?.Invoke(options); } private static IServiceCollectionQuartzConfigurator AddJob(this IServiceCollectionQuartzConfigurator quartz) where TJob : IElsaJob => quartz.AddJob>(job => job.StoreDurably().WithIdentity(nameof(RunWorkflowJob))); private static void ConfigureQuartz(IServiceCollectionQuartzConfigurator quartz, Action? configureQuartz) { quartz.UseMicrosoftDependencyInjectionJobFactory(); quartz.AddJob>(job => job.StoreDurably().WithIdentity(nameof(RunWorkflowJob))); quartz.UseSimpleTypeLoader(); quartz.UseInMemoryStore(); configureQuartz?.Invoke(quartz); } }