using Elsa.Common.Features; using Elsa.Common.Multitenancy; using Elsa.Extensions; using Elsa.Features.Abstractions; using Elsa.Features.Attributes; using Elsa.Features.Services; using Elsa.Scheduling.Bookmarks; using Elsa.Scheduling.Handlers; using Elsa.Scheduling.HostedServices; using Elsa.Scheduling.Services; using Elsa.Scheduling.TriggerPayloadValidators; using Elsa.Workflows.Management.Features; using Microsoft.Extensions.DependencyInjection; namespace Elsa.Scheduling.Features; /// /// Provides scheduling features to the system. /// [DependsOn(typeof(SystemClockFeature))] public class SchedulingFeature : FeatureBase { /// public SchedulingFeature(IModule module) : base(module) { } /// /// Gets or sets the trigger scheduler. /// public Func WorkflowScheduler { get; set; } = sp => sp.GetRequiredService(); /// /// Gets or sets the CRON parser. /// public Func CronParser { get; set; } = sp => sp.GetRequiredService(); /// public override void Apply() { Services .AddSingleton() .AddSingleton(sp => sp.GetRequiredService()) .AddSingleton(sp => sp.GetRequiredService()) .AddSingleton() .AddSingleton() .AddSingleton(CronParser) .AddScoped() .AddScoped() .AddScoped() .AddScoped(WorkflowScheduler) .AddBackgroundTask() .AddHandlersFrom() //Trigger payload validators. .AddTriggerPayloadValidator() // Graceful shutdown: register scheduled-trigger ingress for diagnostic visibility (FR-006). .AddSingleton(); Module.Configure(management => management.AddActivitiesFrom()); } }