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.
This commit is contained in:
Sipke Schoorstra 2023-03-24 20:59:15 +01:00
parent ac8e43cbed
commit 0e992a9cbd

View file

@ -30,11 +30,11 @@ public class WorkflowDefinitionActivity : Composite, IInitializable
/// <inheritdoc />
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<IActivityRegistry>();
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<IWorkflowMaterializer>();
var root = await materializer.MaterializeAsync(workflowDefinition, cancellationToken);
DefineInputAsVariables(context);
DeclareInputOutputAsVariables(context);
Root = root;
}