From 0e992a9cbd926a1784c0ef4b7cfcee9197c3dc46 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 24 Mar 2023 20:59:15 +0100 Subject: [PATCH] Ensure outputs on WorkflowDefinitionActivity are declared in memory register This ensures that activities in the workflow setting a variable assign it to the right location in the right memory register. --- .../WorkflowDefinitionActivity.cs | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs b/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs index 407da6f25..3d8402881 100644 --- a/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs +++ b/src/modules/Elsa.Workflows.Management/Activities/WorkflowDefinitionActivity/WorkflowDefinitionActivity.cs @@ -30,11 +30,11 @@ public class WorkflowDefinitionActivity : Composite, IInitializable /// protected override async ValueTask ExecuteAsync(ActivityExecutionContext context) { - CopyInputToVariables(context); + CopyInputOutputToVariables(context); await context.ScheduleActivityAsync(Root, OnChildCompletedAsync); } - private void CopyInputToVariables(ActivityExecutionContext context) + private void CopyInputOutputToVariables(ActivityExecutionContext context) { foreach (var inputDescriptor in context.ActivityDescriptor.Inputs) { @@ -52,13 +52,26 @@ public class WorkflowDefinitionActivity : Composite, IInitializable context.ExpressionExecutionContext.Memory.Declare(variable); variable.Set(context, evaluatedExpression); } + + foreach (var outputDescriptor in context.ActivityDescriptor.Outputs) + { + // Create a local scope variable for each output property. + var variable = new Variable + { + Id = outputDescriptor.Name, + Name = outputDescriptor.Name + }; + + context.ExpressionExecutionContext.Memory.Declare(variable); + } } - private void DefineInputAsVariables(InitializationContext context) + private void DeclareInputOutputAsVariables(InitializationContext context) { var activityRegistry = context.ServiceProvider.GetRequiredService(); var activityDescriptor = activityRegistry.Find(Type, Version)!; - + + // Declare input variables. foreach (var inputDescriptor in activityDescriptor.Inputs) { // Create a local scope variable for each input property. @@ -70,6 +83,18 @@ public class WorkflowDefinitionActivity : Composite, IInitializable Variables.Declare(variable); } + + // Declare output variables. + foreach (var outputDescriptor in activityDescriptor.Outputs) + { + // Create a local scope variable for each output property. + var variable = new Variable(outputDescriptor.Name) + { + Name = outputDescriptor.Name + }; + + Variables.Declare(variable); + } } private async ValueTask OnChildCompletedAsync(ActivityExecutionContext context, ActivityExecutionContext childContext) @@ -115,7 +140,7 @@ public class WorkflowDefinitionActivity : Composite, IInitializable var materializer = serviceProvider.GetRequiredService(); var root = await materializer.MaterializeAsync(workflowDefinition, cancellationToken); - DefineInputAsVariables(context); + DeclareInputOutputAsVariables(context); Root = root; }