From a33cb1bc88bae6c156055b3a307a602a514b4bd8 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Tue, 8 Jun 2021 21:11:55 +0200 Subject: [PATCH] Implement scoped naming for composite activity children Fixes #1071 --- .../Elsa.Abstractions/Builders/IActivityBuilder.cs | 2 +- src/core/Elsa.Core/Builders/ActivityBuilder.cs | 6 +++++- .../Elsa.Core/Builders/CompositeActivityBuilder.cs | 14 +++++++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/core/Elsa.Abstractions/Builders/IActivityBuilder.cs b/src/core/Elsa.Abstractions/Builders/IActivityBuilder.cs index 1eca04705..1bb14ef61 100644 --- a/src/core/Elsa.Abstractions/Builders/IActivityBuilder.cs +++ b/src/core/Elsa.Abstractions/Builders/IActivityBuilder.cs @@ -24,7 +24,7 @@ namespace Elsa.Builders IActivityBuilder Add(string activityTypeName, Action>? setup = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) where T : class, IActivity; IOutcomeBuilder When(string outcome); IActivityBuilder Then(IActivityBuilder targetActivity); - IConnectionBuilder ThenNamed(string activityName); + IActivityBuilder ThenNamed(string activityName); IActivityBuilder WithId(string? value); IActivityBuilder WithName(string? value); IActivityBuilder WithDisplayName(string? value); diff --git a/src/core/Elsa.Core/Builders/ActivityBuilder.cs b/src/core/Elsa.Core/Builders/ActivityBuilder.cs index 0791d0f45..fa376560d 100644 --- a/src/core/Elsa.Core/Builders/ActivityBuilder.cs +++ b/src/core/Elsa.Core/Builders/ActivityBuilder.cs @@ -76,11 +76,15 @@ namespace Elsa.Builders return this; } - public virtual IConnectionBuilder ThenNamed(string activityName) => + public virtual IActivityBuilder ThenNamed(string activityName) + { WorkflowBuilder.Connect( () => this, () => WorkflowBuilder.Activities.First(x => x.Name == activityName)); + return this; + } + public IActivityBuilder WithId(string? value) { ActivityId = value!; diff --git a/src/core/Elsa.Core/Builders/CompositeActivityBuilder.cs b/src/core/Elsa.Core/Builders/CompositeActivityBuilder.cs index 6cd1af028..522dbfc3e 100644 --- a/src/core/Elsa.Core/Builders/CompositeActivityBuilder.cs +++ b/src/core/Elsa.Core/Builders/CompositeActivityBuilder.cs @@ -160,6 +160,12 @@ namespace Elsa.Builders return connectionBuilder; } + public override IActivityBuilder ThenNamed(string activityName) + { + var compositeName = GetCompositeName(activityName)!; + return base.ThenNamed(compositeName); + } + public ICompositeActivityBlueprint Build(string activityIdPrefix = "activity") { var compositeActivityBlueprint = new CompositeActivityBlueprint @@ -240,14 +246,16 @@ namespace Elsa.Builders } } - private static IActivityBlueprint BuildActivityBlueprint(IActivityBuilder builder, ICompositeActivityBlueprint parent) + private IActivityBlueprint BuildActivityBlueprint(IActivityBuilder builder, ICompositeActivityBlueprint parent) { var isComposite = typeof(CompositeActivity).IsAssignableFrom(builder.ActivityType); return isComposite - ? new CompositeActivityBlueprint(builder.ActivityId, parent, builder.Name, builder.DisplayName, builder.Description, builder.ActivityTypeName, builder.PersistWorkflowEnabled, builder.LoadWorkflowContextEnabled, + ? new CompositeActivityBlueprint(builder.ActivityId, parent, GetCompositeName(builder.Name), builder.DisplayName, builder.Description, builder.ActivityTypeName, builder.PersistWorkflowEnabled, builder.LoadWorkflowContextEnabled, builder.SaveWorkflowContextEnabled, builder.PersistOutputEnabled, builder.Source) - : new ActivityBlueprint(builder.ActivityId, parent, builder.Name, builder.DisplayName, builder.Description, builder.ActivityTypeName, builder.PersistWorkflowEnabled, builder.LoadWorkflowContextEnabled, + : new ActivityBlueprint(builder.ActivityId, parent, GetCompositeName(builder.Name), builder.DisplayName, builder.Description, builder.ActivityTypeName, builder.PersistWorkflowEnabled, builder.LoadWorkflowContextEnabled, builder.SaveWorkflowContextEnabled, builder.PersistOutputEnabled, builder.Source); } + + private string? GetCompositeName(string? activityName) => activityName == null ? null : $"{ActivityId}:{activityName}"; } } \ No newline at end of file