diff --git a/src/activities/Elsa.Activities.Temporal.Common/Extensions/CommonTemporalActivityServices.cs b/src/activities/Elsa.Activities.Temporal.Common/Extensions/CommonTemporalActivityServices.cs new file mode 100644 index 000000000..2af18e050 --- /dev/null +++ b/src/activities/Elsa.Activities.Temporal.Common/Extensions/CommonTemporalActivityServices.cs @@ -0,0 +1,46 @@ +using System; +using Elsa.Activities.Temporal.Bookmarks; +using Elsa.Activities.Temporal.Handlers; +using Elsa.Activities.Temporal.Options; +using Elsa.Activities.Temporal.StartupTasks; +using Elsa.Runtime; +using Microsoft.Extensions.DependencyInjection; + +// ReSharper disable once CheckNamespace +namespace Elsa.Activities.Temporal +{ + public static class CommonTemporalActivityServices + { + /// + /// Adds services which are common to temporal activities. This method is intended for internal use only. + /// + /// + /// + /// Instead of calling this method directly, when setting up Elsa for temporal (time-based) activities, + /// developers should make use of one of the implementation-specific add-temporal-activities methods. + /// Without providing an implementation-specific configuration in , this method + /// will not fully set up the temporal activities. + /// + /// + /// Elsa options + /// The configuration for temporal activity options + public static void AddCommonTemporalActivities(ElsaOptions options, Action? configure = default) + { + var timersOptions = new TimersOptions(options.Services); + configure?.Invoke(timersOptions); + + options.Services + .AddNotificationHandlers(typeof(RemoveScheduledTriggers)) + .AddStartupTask() + .AddBookmarkProvider() + .AddBookmarkProvider() + .AddBookmarkProvider(); + + options + .AddActivity() + .AddActivity() + .AddActivity() + .AddActivity(); + } + } +} \ No newline at end of file diff --git a/src/activities/Elsa.Activities.Temporal.Common/Extensions/ServiceCollectionExtensions.cs b/src/activities/Elsa.Activities.Temporal.Common/Extensions/ServiceCollectionExtensions.cs deleted file mode 100644 index 158006935..000000000 --- a/src/activities/Elsa.Activities.Temporal.Common/Extensions/ServiceCollectionExtensions.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using Elsa; -using Elsa.Activities.Temporal; -using Elsa.Activities.Temporal.Bookmarks; -using Elsa.Activities.Temporal.Handlers; -using Elsa.Activities.Temporal.Options; -using Elsa.Activities.Temporal.StartupTasks; -using Elsa.Runtime; - -// ReSharper disable once CheckNamespace -namespace Microsoft.Extensions.DependencyInjection -{ - public static class ServiceCollectionExtensions - { - public static ElsaOptions AddTimerActivities(this ElsaOptions options, Action? configure = default) - { - var timersOptions = new TimersOptions(options.Services); - configure?.Invoke(timersOptions); - - options.Services - .AddNotificationHandlers(typeof(RemoveScheduledTriggers)) - .AddStartupTask() - .AddBookmarkProvider() - .AddBookmarkProvider() - .AddBookmarkProvider(); - - return options - .AddActivity() - .AddActivity() - .AddActivity() - .AddActivity(); - } - } -} \ No newline at end of file diff --git a/src/activities/Elsa.Activities.Temporal.Hangfire/Extensions/ElsaOptionsExtensions.cs b/src/activities/Elsa.Activities.Temporal.Hangfire/Extensions/ElsaOptionsExtensions.cs index e0ac03f2a..2268edb59 100644 --- a/src/activities/Elsa.Activities.Temporal.Hangfire/Extensions/ElsaOptionsExtensions.cs +++ b/src/activities/Elsa.Activities.Temporal.Hangfire/Extensions/ElsaOptionsExtensions.cs @@ -1,12 +1,23 @@ using System; using Hangfire; -using Microsoft.Extensions.DependencyInjection; +using Elsa.Activities.Temporal; // ReSharper disable once CheckNamespace namespace Elsa { public static class ElsaOptionsExtensions { - public static ElsaOptions AddHangfireTimerActivities(this ElsaOptions options, Action configure) => options.AddTimerActivities(timer => timer.UseHangfire(configure)); + /// + /// Adds temporal (time-based) activities to Elsa, using the Hangfire implementation. + /// + /// Elsa options + /// A Hangfire configuration callback + /// The Elsa options, enabling method chaining + public static ElsaOptions AddHangfireTemporalActivities(this ElsaOptions options, + Action configure) + { + CommonTemporalActivityServices.AddCommonTemporalActivities(options, timer => timer.UseHangfire(configure)); + return options; + } } } \ No newline at end of file diff --git a/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/ElsaOptionsExtensions.cs b/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/ElsaOptionsExtensions.cs index dc55f48bb..af40d25d3 100644 --- a/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/ElsaOptionsExtensions.cs +++ b/src/activities/Elsa.Activities.Temporal.Quartz/Extensions/ElsaOptionsExtensions.cs @@ -1,5 +1,5 @@ using System; -using Microsoft.Extensions.DependencyInjection; +using Elsa.Activities.Temporal; using Quartz; // ReSharper disable once CheckNamespace @@ -7,7 +7,19 @@ namespace Elsa { public static class ElsaOptionsExtensions { - public static ElsaOptions AddQuartzTimerActivities(this ElsaOptions options, Action? configureOptions = default, Action? configureQuartz = default) => - options.AddTimerActivities(timer => timer.UseQuartzProvider(configureOptions, configureQuartz)); + /// + /// Adds temporal (time-based) activities to Elsa, using the Quartz implementation. + /// + /// Elsa options + /// An optional Quartz configuration callback + /// An optional service collection Quartz configuration callback + /// The Elsa options, enabling method chaining + public static ElsaOptions AddQuartzTemporalActivities(this ElsaOptions options, + Action? configure = default, + Action? configureQuartz = default) + { + CommonTemporalActivityServices.AddCommonTemporalActivities(options, timer => timer.UseQuartzProvider(configure, configureQuartz)); + return options; + } } } \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Startup.cs b/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Startup.cs index ecab4d329..52d6e8aec 100644 --- a/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Startup.cs +++ b/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Startup.cs @@ -15,7 +15,7 @@ namespace Elsa.Samples.ForkJoinTimerAndSignalHttp services .AddElsa(options => options .AddConsoleActivities() - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddWorkflow() ) .AddHostedService>(); diff --git a/src/samples/aspnet/Elsa.Samples.Interrupts/Startup.cs b/src/samples/aspnet/Elsa.Samples.Interrupts/Startup.cs index 70981683e..f2d15e3aa 100644 --- a/src/samples/aspnet/Elsa.Samples.Interrupts/Startup.cs +++ b/src/samples/aspnet/Elsa.Samples.Interrupts/Startup.cs @@ -16,7 +16,7 @@ namespace Elsa.Samples.Interrupts .AddElsa(options => options .AddConsoleActivities() .AddHttpActivities() - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddActivity()) .StartWorkflow(); } diff --git a/src/samples/dashboard/ElsaDashboard.Samples.Monolith/Startup.cs b/src/samples/dashboard/ElsaDashboard.Samples.Monolith/Startup.cs index f6f647a77..234179ad7 100644 --- a/src/samples/dashboard/ElsaDashboard.Samples.Monolith/Startup.cs +++ b/src/samples/dashboard/ElsaDashboard.Samples.Monolith/Startup.cs @@ -34,7 +34,7 @@ namespace ElsaDashboard.Samples.Monolith .AddConsoleActivities() .AddHttpActivities(elsaSection.GetSection("Http").Bind) .AddEmailActivities(elsaSection.GetSection("Smtp").Bind) - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddWorkflowsFrom() ); diff --git a/src/samples/server/Elsa.Samples.Server.Host/Startup.cs b/src/samples/server/Elsa.Samples.Server.Host/Startup.cs index 2b45406a9..fb2aed01d 100644 --- a/src/samples/server/Elsa.Samples.Server.Host/Startup.cs +++ b/src/samples/server/Elsa.Samples.Server.Host/Startup.cs @@ -29,7 +29,7 @@ namespace Elsa.Samples.Server.Host .AddConsoleActivities() .AddHttpActivities(elsaSection.GetSection("Http").Bind) .AddEmailActivities(elsaSection.GetSection("Smtp").Bind) - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddWorkflowsFrom() ); diff --git a/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Program.cs b/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Program.cs index c4323fc68..e2e702e51 100644 --- a/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Program.cs +++ b/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Program.cs @@ -25,7 +25,7 @@ namespace Elsa.Samples.AzureServiceBusWorker //.UseYesSqlPersistence(yesSql => yesSql.UseSqLite("Data Source=elsa.yessql.db;Cache=Shared", IsolationLevel.ReadUncommitted)) .UseEntityFrameworkPersistence(db => db.UseSqlite("Data Source=elsa.efcore.db;Cache=Shared", sqlite => sqlite.MigrationsAssembly(typeof(SqliteElsaContextFactory).Assembly.GetName().Name)), true) .AddConsoleActivities() - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddAzureServiceBusActivities(o => o.ConnectionString = hostContext.Configuration.GetConnectionString("AzureServiceBus")) .AddWorkflow() .AddWorkflow()); diff --git a/src/samples/worker/Elsa.Samples.BreakLoop/Program.cs b/src/samples/worker/Elsa.Samples.BreakLoop/Program.cs index 332cca681..b37ae9315 100644 --- a/src/samples/worker/Elsa.Samples.BreakLoop/Program.cs +++ b/src/samples/worker/Elsa.Samples.BreakLoop/Program.cs @@ -17,7 +17,7 @@ namespace Elsa.Samples.BreakLoop services .AddElsa(options => options.UseYesSqlPersistence() .AddConsoleActivities() - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddActivitiesFrom() .AddWorkflowsFrom()); diff --git a/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Program.cs b/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Program.cs index 4b0280a83..35ea27a2d 100644 --- a/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Program.cs +++ b/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Program.cs @@ -19,7 +19,7 @@ namespace Elsa.Samples.CustomAttributesChildWorker { services .AddElsa(options => options - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddConsoleActivities() .AddRebusActivities() .AddWorkflow() diff --git a/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs b/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs index 83f7ca5c9..1e1552bc5 100644 --- a/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs +++ b/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs @@ -20,7 +20,7 @@ namespace Elsa.Samples.DistributedLock services .AddElsa(options => options.UseRedisLockProvider("localhost:6379,abortConnect=false") .AddConsoleActivities() - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddWorkflow()); }); } diff --git a/src/samples/worker/Elsa.Samples.Faulting/Program.cs b/src/samples/worker/Elsa.Samples.Faulting/Program.cs index 9f919acdb..ef2fc2b33 100644 --- a/src/samples/worker/Elsa.Samples.Faulting/Program.cs +++ b/src/samples/worker/Elsa.Samples.Faulting/Program.cs @@ -20,7 +20,7 @@ namespace Elsa.Samples.Faulting .AddElsa(options => options .UseYesSqlPersistence() .AddConsoleActivities() - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddWorkflow()); }); } diff --git a/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Program.cs b/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Program.cs index 7bf660f2a..4ca8242c7 100644 --- a/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Program.cs +++ b/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Program.cs @@ -19,7 +19,7 @@ namespace Elsa.Samples.MultiTenantChildWorker { services .AddElsa(options => options - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddConsoleActivities() .AddRebusActivities() .AddWorkflow() diff --git a/src/samples/worker/Elsa.Samples.RebusWorker/Program.cs b/src/samples/worker/Elsa.Samples.RebusWorker/Program.cs index 7415e5a05..39f936737 100644 --- a/src/samples/worker/Elsa.Samples.RebusWorker/Program.cs +++ b/src/samples/worker/Elsa.Samples.RebusWorker/Program.cs @@ -26,7 +26,7 @@ namespace Elsa.Samples.RebusWorker db => db.MigrationsAssembly(typeof(SqliteElsaContextFactory).Assembly.GetName().Name)); }, true) .AddConsoleActivities() - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddRebusActivities() .AddWorkflow() .AddWorkflow()); diff --git a/src/samples/worker/Elsa.Samples.Timers.Hangfire/Program.cs b/src/samples/worker/Elsa.Samples.Timers.Hangfire/Program.cs index ff7e88dd2..a591618cc 100644 --- a/src/samples/worker/Elsa.Samples.Timers.Hangfire/Program.cs +++ b/src/samples/worker/Elsa.Samples.Timers.Hangfire/Program.cs @@ -18,7 +18,7 @@ namespace Elsa.Samples.Timers services .AddElsa(options => options .AddConsoleActivities() - .AddHangfireTimerActivities(hangfire => hangfire.UseSqlServerStorage("Server=(localdb)\\MSSQLLocalDB;Database=ElsaHangfire;Trusted_Connection=True;MultipleActiveResultSets=true")) + .AddHangfireTemporalActivities(hangfire => hangfire.UseSqlServerStorage("Server=(localdb)\\MSSQLLocalDB;Database=ElsaHangfire;Trusted_Connection=True;MultipleActiveResultSets=true")) .AddWorkflow() .AddWorkflow() .AddWorkflow() diff --git a/src/samples/worker/Elsa.Samples.Timers.Quartz/Program.cs b/src/samples/worker/Elsa.Samples.Timers.Quartz/Program.cs index 4964c25e8..85d380490 100644 --- a/src/samples/worker/Elsa.Samples.Timers.Quartz/Program.cs +++ b/src/samples/worker/Elsa.Samples.Timers.Quartz/Program.cs @@ -21,7 +21,7 @@ namespace Elsa.Samples.Timers .AddElsa(options => options .UseEntityFrameworkPersistence(ef => ef.UseSqlite()) .AddConsoleActivities() - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddActivity() .AddActivity() //.AddWorkflow() diff --git a/src/samples/worker/Elsa.Samples.WhileLoopWorker/Program.cs b/src/samples/worker/Elsa.Samples.WhileLoopWorker/Program.cs index b29452968..ca6ed43ec 100644 --- a/src/samples/worker/Elsa.Samples.WhileLoopWorker/Program.cs +++ b/src/samples/worker/Elsa.Samples.WhileLoopWorker/Program.cs @@ -19,7 +19,7 @@ namespace Elsa.Samples.WhileLoopWorker services .AddElsa(options => options.UseYesSqlPersistence() .AddConsoleActivities() - .AddQuartzTimerActivities() + .AddQuartzTemporalActivities() .AddActivity() .AddWorkflow()) .AddSingleton() diff --git a/test/integration/Elsa.Core.IntegrationTests/Extensions/TemporalServiceCollectionExtensionsTests.cs b/test/integration/Elsa.Core.IntegrationTests/Extensions/TemporalServiceCollectionExtensionsTests.cs index 5c301fe16..ddf5eabf2 100644 --- a/test/integration/Elsa.Core.IntegrationTests/Extensions/TemporalServiceCollectionExtensionsTests.cs +++ b/test/integration/Elsa.Core.IntegrationTests/Extensions/TemporalServiceCollectionExtensionsTests.cs @@ -5,17 +5,18 @@ using Xunit; using Hangfire; using System.Threading.Tasks; using System.Threading; +using Elsa.Activities.Temporal; namespace Elsa.UnitTests.Extensions { public class TemporalServiceCollectionExtensionsTests { - [Fact(DisplayName = "Starting a hosted app which uses only AddTimerActivities should throw InvalidOperationException because of the missing impl")] - public void AddTimerActivitiesThrowsDuringStartupIfNoTemporalImplementationPresent() + [Fact(DisplayName = "Starting a hosted app which uses only AddCommonTemporalActivities should throw InvalidOperationException because of the missing impl")] + public void AddCommonTemporalActivitiesThrowsDuringStartupIfNoTemporalImplementationPresent() { var hostBuilder = CreateHostBuilderUsingServices(services => { services.AddElsa(elsa => { - elsa.AddTimerActivities(); + CommonTemporalActivityServices.AddCommonTemporalActivities(elsa); }); }); @@ -32,12 +33,12 @@ namespace Elsa.UnitTests.Extensions } } - [Fact(DisplayName = "Starting a hosted app which uses AddHangfireTimerActivities should not throw")] - public void AddHangfireTimerActivitiesDoesNotThrowDuringStartup() + [Fact(DisplayName = "Starting a hosted app which uses AddHangfireTemporalActivities should not throw")] + public void AddHangfireTemporalActivitiesDoesNotThrowDuringStartup() { var hostBuilder = CreateHostBuilderUsingServices(services => { services.AddElsa(elsa => { - elsa.AddHangfireTimerActivities(config => config.UseInMemoryStorage()); + elsa.AddHangfireTemporalActivities(config => config.UseInMemoryStorage()); }); }); @@ -56,12 +57,12 @@ namespace Elsa.UnitTests.Extensions } } - [Fact(DisplayName = "Starting a hosted app which uses AddQuartzTimerActivities should not throw")] - public void AddQuartzTimerActivitiesDoesNotThrowDuringStartup() + [Fact(DisplayName = "Starting a hosted app which uses AddQuartzTemporalActivities should not throw")] + public void AddQuartzTemporalActivitiesDoesNotThrowDuringStartup() { var hostBuilder = CreateHostBuilderUsingServices(services => { services.AddElsa(elsa => { - elsa.AddQuartzTimerActivities(); + elsa.AddQuartzTemporalActivities(); }); });