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