From c99280b792dae513275ebbf7e902282e4495d14b Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 28 May 2023 16:20:16 +0200 Subject: [PATCH] Add methods to add multiple workflows from a given assembly --- Elsa.sln | 2 +- .../Features/WorkflowManagementFeature.cs | 2 +- .../Extensions/ModuleExtensions.cs | 15 ++++++++++++ .../WorkflowDictionaryExtensions.cs | 23 +++++++++++++++---- .../Features/WorkflowRuntimeFeature.cs | 16 +++++++++++++ .../Elsa.Samples.AspNet.HelloWorld.csproj} | 0 .../HelloWorldHttpWorkflow.cs | 2 +- .../Program.cs | 8 +------ 8 files changed, 54 insertions(+), 14 deletions(-) rename src/samples/aspnet/{Elsa.Samples.HelloWorld/Elsa.Samples.HelloWorld.csproj => Elsa.Samples.AspNet.HelloWorld/Elsa.Samples.AspNet.HelloWorld.csproj} (100%) rename src/samples/aspnet/{Elsa.Samples.HelloWorld => Elsa.Samples.AspNet.HelloWorld}/HelloWorldHttpWorkflow.cs (95%) rename src/samples/aspnet/{Elsa.Samples.HelloWorld => Elsa.Samples.AspNet.HelloWorld}/Program.cs (69%) diff --git a/Elsa.sln b/Elsa.sln index 8c078cad5..0733122e8 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -109,7 +109,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Email", "src\modules\E EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Workflows.Designer", "src\modules\Elsa.Workflows.Designer\Elsa.Workflows.Designer.csproj", "{B191F11D-583D-44D9-8A08-F5B0DC58B822}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.HelloWorld", "src\samples\aspnet\Elsa.Samples.HelloWorld\Elsa.Samples.HelloWorld.csproj", "{DF8CCA17-6B00-42C6-B4EC-61B42AA91EE0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.AspNet.HelloWorld", "src\samples\aspnet\Elsa.Samples.AspNet.HelloWorld\Elsa.Samples.AspNet.HelloWorld.csproj", "{DF8CCA17-6B00-42C6-B4EC-61B42AA91EE0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Testing.Shared", "src\common\Elsa.Testing.Shared\Elsa.Testing.Shared.csproj", "{AD8C4BB0-C78F-496C-B326-1D82C02C7568}" EndProject diff --git a/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs b/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs index 8084d0ac0..1b00c04e7 100644 --- a/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs +++ b/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs @@ -87,7 +87,7 @@ public class WorkflowManagementFeature : FeatureBase public WorkflowManagementFeature AddActivitiesFrom() { var activityTypes = typeof(TMarker).Assembly.GetExportedTypes() - .Where(x => typeof(IActivity).IsAssignableFrom(x) && !x.IsAbstract && !x.IsInterface && !x.IsGenericType) + .Where(x => typeof(IActivity).IsAssignableFrom(x) && x is { IsAbstract: false, IsInterface: false, IsGenericType: false }) .ToList(); return AddActivities(activityTypes); } diff --git a/src/modules/Elsa.Workflows.Runtime/Extensions/ModuleExtensions.cs b/src/modules/Elsa.Workflows.Runtime/Extensions/ModuleExtensions.cs index 78f13ac5c..71db23067 100644 --- a/src/modules/Elsa.Workflows.Runtime/Extensions/ModuleExtensions.cs +++ b/src/modules/Elsa.Workflows.Runtime/Extensions/ModuleExtensions.cs @@ -1,3 +1,4 @@ +using System.Reflection; using Elsa.Features.Services; using Elsa.Workflows.Core.Contracts; using Elsa.Workflows.Runtime.Features; @@ -37,6 +38,20 @@ public static class ModuleExtensions module.Configure().AddWorkflow(); return module; } + + /// + /// Register all workflows contained in the assembly containing the specified marker type. + /// + public static IModule AddWorkflowsFrom(this IModule module) => module.AddWorkflowsFrom(typeof(TMarker).Assembly); + + /// + /// Register all workflows in the specified assembly. + /// + public static IModule AddWorkflowsFrom(this IModule module, Assembly assembly) + { + module.Configure().AddWorkflowsFrom(assembly); + return module; + } /// /// Configures the default workflow runtime. diff --git a/src/modules/Elsa.Workflows.Runtime/Extensions/WorkflowDictionaryExtensions.cs b/src/modules/Elsa.Workflows.Runtime/Extensions/WorkflowDictionaryExtensions.cs index 3fae58787..7e9a1a4df 100644 --- a/src/modules/Elsa.Workflows.Runtime/Extensions/WorkflowDictionaryExtensions.cs +++ b/src/modules/Elsa.Workflows.Runtime/Extensions/WorkflowDictionaryExtensions.cs @@ -12,9 +12,24 @@ public static class WorkflowDictionaryExtensions /// /// Register a workflow factory that creates an instance of the specified workflow type. /// - public static void Add(this IDictionary>> dictionary) where TWorkflow : IWorkflow => dictionary.Add(typeof(TWorkflow).Name, sp => + public static void Add(this IDictionary>> dictionary) where TWorkflow : IWorkflow { - var workflow = ActivatorUtilities.GetServiceOrCreateInstance(sp); - return new ValueTask(workflow); - }); + dictionary.Add(typeof(TWorkflow).Name, sp => + { + var workflow = ActivatorUtilities.GetServiceOrCreateInstance(sp); + return new ValueTask(workflow); + }); + } + + /// + /// Register a workflow factory that creates an instance of the specified workflow type. + /// + public static void Add(this IDictionary>> dictionary, Type workflowType) + { + dictionary.Add(workflowType.Name, sp => + { + var workflow = (IWorkflow)ActivatorUtilities.GetServiceOrCreateInstance(sp, workflowType); + return new ValueTask(workflow); + }); + } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs b/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs index b39e808f0..e12250e78 100644 --- a/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs +++ b/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs @@ -1,3 +1,4 @@ +using System.Reflection; using Elsa.Common.Features; using Elsa.Extensions; using Elsa.Features.Abstractions; @@ -99,6 +100,21 @@ public class WorkflowRuntimeFeature : FeatureBase Workflows.Add(); return this; } + + /// + /// Register all workflows in the specified assembly. + /// + public WorkflowRuntimeFeature AddWorkflowsFrom(Assembly assembly) + { + var workflowTypes = assembly.GetExportedTypes() + .Where(x => typeof(IWorkflow).IsAssignableFrom(x) && x is { IsAbstract: false, IsInterface: false, IsGenericType: false }) + .ToList(); + + foreach (var workflowType in workflowTypes) + Workflows.Add(workflowType); + + return this; + } /// public override void Configure() diff --git a/src/samples/aspnet/Elsa.Samples.HelloWorld/Elsa.Samples.HelloWorld.csproj b/src/samples/aspnet/Elsa.Samples.AspNet.HelloWorld/Elsa.Samples.AspNet.HelloWorld.csproj similarity index 100% rename from src/samples/aspnet/Elsa.Samples.HelloWorld/Elsa.Samples.HelloWorld.csproj rename to src/samples/aspnet/Elsa.Samples.AspNet.HelloWorld/Elsa.Samples.AspNet.HelloWorld.csproj diff --git a/src/samples/aspnet/Elsa.Samples.HelloWorld/HelloWorldHttpWorkflow.cs b/src/samples/aspnet/Elsa.Samples.AspNet.HelloWorld/HelloWorldHttpWorkflow.cs similarity index 95% rename from src/samples/aspnet/Elsa.Samples.HelloWorld/HelloWorldHttpWorkflow.cs rename to src/samples/aspnet/Elsa.Samples.AspNet.HelloWorld/HelloWorldHttpWorkflow.cs index b1f64d549..4b9fd993a 100644 --- a/src/samples/aspnet/Elsa.Samples.HelloWorld/HelloWorldHttpWorkflow.cs +++ b/src/samples/aspnet/Elsa.Samples.AspNet.HelloWorld/HelloWorldHttpWorkflow.cs @@ -4,7 +4,7 @@ using Elsa.Workflows.Core.Abstractions; using Elsa.Workflows.Core.Activities; using Elsa.Workflows.Core.Contracts; -namespace Elsa.Samples.HelloWorld; +namespace Elsa.Samples.AspNet.HelloWorld; public class HelloWorldHttpWorkflow : WorkflowBase { diff --git a/src/samples/aspnet/Elsa.Samples.HelloWorld/Program.cs b/src/samples/aspnet/Elsa.Samples.AspNet.HelloWorld/Program.cs similarity index 69% rename from src/samples/aspnet/Elsa.Samples.HelloWorld/Program.cs rename to src/samples/aspnet/Elsa.Samples.AspNet.HelloWorld/Program.cs index b6b79513e..19ba12f21 100644 --- a/src/samples/aspnet/Elsa.Samples.HelloWorld/Program.cs +++ b/src/samples/aspnet/Elsa.Samples.AspNet.HelloWorld/Program.cs @@ -1,17 +1,11 @@ using Elsa.Extensions; -using Elsa.Samples.HelloWorld; var builder = WebApplication.CreateBuilder(args); var services = builder.Services; // Add Elsa services. services.AddElsa(elsa => elsa - // Configure the workflow runtime. - .UseWorkflowRuntime(runtime => - { - // Register our HTTP workflow with the runtime. - runtime.AddWorkflow(); - }) + .AddWorkflowsFrom() // Enable Elsa HTTP module (for HTTP related activities). .UseHttp()