using Elsa.Common.Multitenancy; using Elsa.Common.Multitenancy.EventHandlers; using Elsa.Common.Multitenancy.HostedServices; using Elsa.Common.RecurringTasks; using Elsa.Features.Abstractions; using Elsa.Features.Services; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; namespace Elsa.Common.Features; public class MultitenancyFeature(IModule module) : FeatureBase(module) { private Func _tenantsProviderFactory = sp => sp.GetRequiredService(); public MultitenancyFeature UseTenantsProvider() where TTenantsProvider : class, ITenantsProvider { Services.TryAddScoped(); return UseTenantsProvider(sp => sp.GetRequiredService()); } public MultitenancyFeature UseTenantsProvider(Func tenantsProviderFactory) { _tenantsProviderFactory = tenantsProviderFactory; return this; } public override void ConfigureHostedServices() { Module .ConfigureHostedService(-1) ; } public override void Apply() { Services .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() // TenantTaskManager handles all task lifecycle in the correct order .AddSingleton() .AddSingleton(sp => sp.GetRequiredService()) .AddSingleton(sp => sp.GetRequiredService()) .AddSingleton() .AddSingleton() .AddScoped() .AddScoped() .AddScoped() .AddScoped() .AddScoped(_tenantsProviderFactory); } }