diff --git a/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs b/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs
index e3f9fdc08..e2b2ce1e7 100644
--- a/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs
+++ b/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs
@@ -77,8 +77,10 @@ public class WorkflowDefinitionActivity : Composite, IInitializable
var value = variable.Get(activityExecutionContext);
// Assign the value to the output synthetic property.
+ // Make sure to select a parent scope to avoid naming collisions between outputs defined on the current scope and outputs defined on parent scopes.
+ var parentActivityExecutionContext = activityExecutionContext.ParentActivityExecutionContext ?? activityExecutionContext;
var output = SyntheticProperties.TryGetValue(outputDescriptor.Name, out var outputValue) ? (Output?)outputValue : default;
- activityExecutionContext.Set(output, value);
+ parentActivityExecutionContext.Set(output, value);
}
// Complete this activity with the signal value.
diff --git a/test/integration/Elsa.IntegrationTests/Elsa.IntegrationTests.csproj b/test/integration/Elsa.IntegrationTests/Elsa.IntegrationTests.csproj
index cfb14c198..f9b2d58c8 100644
--- a/test/integration/Elsa.IntegrationTests/Elsa.IntegrationTests.csproj
+++ b/test/integration/Elsa.IntegrationTests/Elsa.IntegrationTests.csproj
@@ -132,6 +132,18 @@
Always
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
diff --git a/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Tests.cs b/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Tests.cs
index 7af136198..cb89c1234 100644
--- a/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Tests.cs
+++ b/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Tests.cs
@@ -41,4 +41,26 @@ public class Tests
var lines = _capturingTextWriter.Lines.ToList();
Assert.Equal(new[] { "Result: 9" }, lines);
}
+
+ [Fact(DisplayName = "Multiple parent/child workflows receive output from child workflows even when using same output names.")]
+ public async Task Test2()
+ {
+ // Populate registries.
+ await _services.PopulateRegistriesAsync();
+
+ // Import workflows.
+ await _services.ImportWorkflowDefinitionAsync("Scenarios/ParentChildOutputMapping/Workflows/a.json");
+ await _services.ImportWorkflowDefinitionAsync("Scenarios/ParentChildOutputMapping/Workflows/b.json");
+ await _services.ImportWorkflowDefinitionAsync("Scenarios/ParentChildOutputMapping/Workflows/c.json");
+
+ // Import root workflow.
+ var workflowDefinition = await _services.ImportWorkflowDefinitionAsync("Scenarios/ParentChildOutputMapping/Workflows/d.json");
+
+ // Execute.
+ await _services.RunWorkflowUntilEndAsync(workflowDefinition.DefinitionId);
+
+ // Assert expected output.
+ var lines = _capturingTextWriter.Lines.ToList();
+ Assert.Equal(new[] { "FooBar" }, lines);
+ }
}
\ No newline at end of file
diff --git a/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/a.json b/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/a.json
new file mode 100644
index 000000000..aa9476666
--- /dev/null
+++ b/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/a.json
@@ -0,0 +1 @@
+{"id":"5d8015cea7b44c96","definitionId":"7fe314161d2d2ac6","name":"A","createdAt":"2023-11-15T13:55:38.86581+00:00","version":1,"toolVersion":"3.0.0.0","variables":[],"inputs":[],"outputs":[{"type":"Object","name":"Output1","displayName":"Output 1","category":"Primitives","isArray":false}],"outcomes":[],"customProperties":{"Elsa:WorkflowContextProviderTypes":[]},"isReadonly":false,"isLatest":true,"isPublished":true,"options":{"usableAsActivity":true,"autoUpdateConsumingWorkflows":true},"root":{"type":"Elsa.Flowchart","version":1,"id":"d84ccfca1b90bc0c","nodeId":"Workflow1:d84ccfca1b90bc0c","metadata":{},"customProperties":{"source":"FlowchartJsonConverter.cs:47","notFoundConnections":[],"canStartWorkflow":false,"runAsynchronously":false},"activities":[{"outputName":{"typeName":"String","expression":{"type":"Literal","value":"Output1"},"memoryReference":{"id":"a6389a28e986c6ff:input-0"}},"outputValue":{"typeName":"Object","expression":{"type":"Literal","value":"Foo"},"memoryReference":{"id":"a6389a28e986c6ff:input-1"}},"id":"a6389a28e986c6ff","nodeId":"Workflow1:d84ccfca1b90bc0c:a6389a28e986c6ff","name":"SetOutput1","type":"Elsa.SetOutput","version":1,"customProperties":{"canStartWorkflow":false,"runAsynchronously":false},"metadata":{"designer":{"position":{"x":-60,"y":240},"size":{"width":107.734375,"height":50}}}}],"connections":[]}}
\ No newline at end of file
diff --git a/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/b.json b/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/b.json
new file mode 100644
index 000000000..ad8e6b858
--- /dev/null
+++ b/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/b.json
@@ -0,0 +1 @@
+{"id":"d5221501eeb78037","definitionId":"8c751e0c53821439","name":"B","createdAt":"2023-11-15T13:59:18.773434+00:00","version":1,"toolVersion":"3.0.0.0","variables":[],"inputs":[],"outputs":[{"type":"Object","name":"Output1","displayName":"Output 1","category":"Primitives","isArray":false}],"outcomes":[],"customProperties":{"Elsa:WorkflowContextProviderTypes":[]},"isReadonly":false,"isLatest":true,"isPublished":true,"options":{"usableAsActivity":true,"autoUpdateConsumingWorkflows":true},"root":{"type":"Elsa.Flowchart","version":1,"id":"49a24a01a4c318de","nodeId":"Workflow1:49a24a01a4c318de","metadata":{},"customProperties":{"source":"FlowchartJsonConverter.cs:47","notFoundConnections":[],"canStartWorkflow":false,"runAsynchronously":false},"activities":[{"script":{"typeName":"String","expression":{"type":"Literal","value":"return \u0022Bar\u0022;"},"memoryReference":{"id":"247da1e267d76f80:input-0"}},"possibleOutcomes":null,"result":{"typeName":"Object","memoryReference":{"id":"Output1"}},"id":"247da1e267d76f80","nodeId":"Workflow1:49a24a01a4c318de:247da1e267d76f80","name":"RunCSharp1","type":"Elsa.RunCSharp","version":1,"customProperties":{"canStartWorkflow":false,"runAsynchronously":false},"metadata":{"designer":{"position":{"x":-200,"y":-140},"size":{"width":83.640625,"height":50}}}}],"connections":[]}}
\ No newline at end of file
diff --git a/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/c.json b/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/c.json
new file mode 100644
index 000000000..1295f5cda
--- /dev/null
+++ b/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/c.json
@@ -0,0 +1 @@
+{"id":"c4041d72854d317c","definitionId":"8472bcf9ca261e55","name":"C","createdAt":"2023-11-15T14:05:30.708042+00:00","version":6,"toolVersion":"3.0.0.0","variables":[],"inputs":[],"outputs":[{"type":"Object","name":"Output1","displayName":"Output 1","category":"Primitives","isArray":false},{"type":"Object","name":"Output2","displayName":"Output 2","category":"Primitives","isArray":false}],"outcomes":[],"customProperties":{"Elsa:WorkflowContextProviderTypes":[]},"isReadonly":false,"isLatest":true,"isPublished":true,"options":{"usableAsActivity":true,"autoUpdateConsumingWorkflows":true},"root":{"type":"Elsa.Flowchart","version":1,"id":"6ee60c9988b58904","nodeId":"Workflow1:6ee60c9988b58904","metadata":{},"customProperties":{"source":"FlowchartJsonConverter.cs:47","notFoundConnections":[],"canStartWorkflow":false,"runAsynchronously":false},"activities":[{"workflowDefinitionId":"7fe314161d2d2ac6","workflowDefinitionVersionId":"5d8015cea7b44c96","latestAvailablePublishedVersion":1,"latestAvailablePublishedVersionId":"5d8015cea7b44c96","id":"67daca2a2fc729b6","nodeId":"Workflow1:6ee60c9988b58904:67daca2a2fc729b6","name":"A1","type":"A","version":1,"customProperties":{"canStartWorkflow":false,"runAsynchronously":false},"metadata":{"designer":{"position":{"x":-311.5,"y":-145},"size":{"width":41.59375,"height":50}}},"output1":{"typeName":"Object","memoryReference":{"id":"Output1"}}},{"workflowDefinitionId":"8c751e0c53821439","workflowDefinitionVersionId":"d5221501eeb78037","latestAvailablePublishedVersion":1,"latestAvailablePublishedVersionId":"d5221501eeb78037","id":"d152d5815dcdea0d","nodeId":"Workflow1:6ee60c9988b58904:d152d5815dcdea0d","name":"B1","type":"B","version":1,"customProperties":{"canStartWorkflow":false,"runAsynchronously":false},"metadata":{"designer":{"position":{"x":-194.5,"y":-145},"size":{"width":41.125,"height":50}}},"output1":{"typeName":"Object","memoryReference":{"id":"Output2"}}}],"connections":[{"source":{"activity":"67daca2a2fc729b6","port":"Done"},"target":{"activity":"d152d5815dcdea0d","port":"In"}}]}}
\ No newline at end of file
diff --git a/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/d.json b/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/d.json
new file mode 100644
index 000000000..0c2dce2f3
--- /dev/null
+++ b/test/integration/Elsa.IntegrationTests/Scenarios/ParentChildOutputMapping/Workflows/d.json
@@ -0,0 +1 @@
+{"id":"cbf12a4a3d1a52ef","definitionId":"133353946cd83e1d","name":"D","createdAt":"2023-11-15T14:07:04.052579+00:00","version":1,"toolVersion":"3.0.0.0","variables":[{"id":"f1106ece80fd17a8","name":"Variable1","typeName":"Object","isArray":false,"storageDriverTypeName":"Elsa.Workflows.Core.Services.WorkflowStorageDriver, Elsa.Workflows.Core"},{"id":"3a8b25edc9bf109","name":"Variable2","typeName":"Object","isArray":false,"storageDriverTypeName":"Elsa.Workflows.Core.Services.WorkflowStorageDriver, Elsa.Workflows.Core"}],"inputs":[],"outputs":[],"outcomes":[],"customProperties":{"Elsa:WorkflowContextProviderTypes":[]},"isReadonly":false,"isLatest":true,"isPublished":true,"options":{"autoUpdateConsumingWorkflows":false},"root":{"type":"Elsa.Flowchart","version":1,"id":"26838161a6f32e2e","nodeId":"Workflow1:26838161a6f32e2e","metadata":{},"customProperties":{"source":"FlowchartJsonConverter.cs:47","notFoundConnections":[],"canStartWorkflow":false,"runAsynchronously":false},"activities":[{"workflowDefinitionId":"8472bcf9ca261e55","workflowDefinitionVersionId":"c4041d72854d317c","latestAvailablePublishedVersion":6,"latestAvailablePublishedVersionId":"c4041d72854d317c","id":"db7bda6a28d8de82","nodeId":"Workflow1:26838161a6f32e2e:db7bda6a28d8de82","name":"C1","type":"C","version":6,"customProperties":{"canStartWorkflow":false,"runAsynchronously":false},"metadata":{"designer":{"position":{"x":-298.5,"y":-168},"size":{"width":41.578125,"height":50}}},"output1":{"typeName":"Object","memoryReference":{"id":"f1106ece80fd17a8"}},"output2":{"typeName":"Object","memoryReference":{"id":"3a8b25edc9bf109"}}},{"text":{"typeName":"String","expression":{"type":"CSharp","value":"return $\u0022{Variable.Variable1}{Variable.Variable2}\u0022;"},"memoryReference":{"id":"a815c4cf1e668419:input-0"}},"id":"a815c4cf1e668419","nodeId":"Workflow1:26838161a6f32e2e:a815c4cf1e668419","name":"WriteLine1","type":"Elsa.WriteLine","version":1,"customProperties":{"canStartWorkflow":false,"runAsynchronously":false},"metadata":{"designer":{"position":{"x":-139.5,"y":-168},"size":{"width":139.296875,"height":50}}}}],"connections":[{"source":{"activity":"db7bda6a28d8de82","port":"Done"},"target":{"activity":"a815c4cf1e668419","port":"In"}}]}}
\ No newline at end of file