From ed81b5679a2703ee2b703e0871c1df7df4516acf Mon Sep 17 00:00:00 2001 From: Craig Fowler Date: Sun, 28 Feb 2021 15:44:23 +0000 Subject: [PATCH] WIP #564 - Rename & alter temporal activity setup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Temporal activities no longer have a generalised extension method for registering them with a service collecton. It is still static and has the same rough shape as an extension method. This way it is less visible and less likely to be called by accident. Also in-line with changes in this branch, things have been renamed Timers → Temporal --- .../CommonTemporalActivityServices.cs | 46 +++++++++++++++++++ .../Extensions/ServiceCollectionExtensions.cs | 34 -------------- .../Extensions/ElsaOptionsExtensions.cs | 15 +++++- .../Extensions/ElsaOptionsExtensions.cs | 18 ++++++-- .../Startup.cs | 2 +- .../aspnet/Elsa.Samples.Interrupts/Startup.cs | 2 +- .../ElsaDashboard.Samples.Monolith/Startup.cs | 2 +- .../Elsa.Samples.Server.Host/Startup.cs | 2 +- .../Program.cs | 2 +- .../worker/Elsa.Samples.BreakLoop/Program.cs | 2 +- .../Program.cs | 2 +- .../Elsa.Samples.DistributedLock/Program.cs | 2 +- .../worker/Elsa.Samples.Faulting/Program.cs | 2 +- .../Program.cs | 2 +- .../Elsa.Samples.RebusWorker/Program.cs | 2 +- .../Elsa.Samples.Timers.Hangfire/Program.cs | 2 +- .../Elsa.Samples.Timers.Quartz/Program.cs | 2 +- .../Elsa.Samples.WhileLoopWorker/Program.cs | 2 +- ...emporalServiceCollectionExtensionsTests.cs | 19 ++++---- 19 files changed, 98 insertions(+), 62 deletions(-) create mode 100644 src/activities/Elsa.Activities.Temporal.Common/Extensions/CommonTemporalActivityServices.cs delete mode 100644 src/activities/Elsa.Activities.Temporal.Common/Extensions/ServiceCollectionExtensions.cs 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(); }); });