using Elsa.Jobs.Contracts; using Elsa.Modules.Quartz.Contracts; using Elsa.Modules.Quartz.Jobs; using Elsa.Modules.Quartz.Services; using Elsa.Modules.Scheduling.Jobs; using Microsoft.Extensions.DependencyInjection; using Quartz; using IJob = Elsa.Jobs.Contracts.IJob; namespace Elsa.Modules.Quartz.Extensions; public static class ServiceCollectionExtensions { /// /// Registers both Quartz as well as Elsa-specific services and jobs. /// If you register Quartz yourself, use instead. /// public static IServiceCollection AddQuartzAndModule( 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); AddQuartzModule(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 AddQuartzModule(this IServiceCollection services, IServiceCollectionQuartzConfigurator quartz) { services .AddSingleton() .AddSingleton(); quartz.AddElsaJobs(); return services; } private static IServiceCollectionQuartzConfigurator AddElsaJobs(this IServiceCollectionQuartzConfigurator quartz) { quartz.AddJob(); 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 : IJob => quartz.AddJob>(job => job.StoreDurably().WithIdentity(typeof(TJob).Name)); private static void ConfigureQuartz(IServiceCollectionQuartzConfigurator quartz, Action? configureQuartz) { quartz.UseMicrosoftDependencyInjectionJobFactory(); quartz.UseSimpleTypeLoader(); quartz.UseInMemoryStore(); configureQuartz?.Invoke(quartz); } }