From c2d9ec4fd2a90ed7b93d3fa644986f7aaf39721a Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 15 Oct 2023 11:32:13 +0200 Subject: [PATCH] Make programmatic workflow variable IDs deterministic --- .../Builders/WorkflowBuilder.cs | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/modules/Elsa.Workflows.Core/Builders/WorkflowBuilder.cs b/src/modules/Elsa.Workflows.Core/Builders/WorkflowBuilder.cs index 645ae8aa8..3f8f67f19 100644 --- a/src/modules/Elsa.Workflows.Core/Builders/WorkflowBuilder.cs +++ b/src/modules/Elsa.Workflows.Core/Builders/WorkflowBuilder.cs @@ -12,15 +12,17 @@ public class WorkflowBuilder : IWorkflowBuilder private readonly IActivityVisitor _activityVisitor; private readonly IIdentityGraphService _identityGraphService; private readonly IActivityRegistry _activityRegistry; + private readonly IIdentityGenerator _identityGenerator; /// /// Constructor. /// - public WorkflowBuilder(IActivityVisitor activityVisitor, IIdentityGraphService identityGraphService, IActivityRegistry activityRegistry) + public WorkflowBuilder(IActivityVisitor activityVisitor, IIdentityGraphService identityGraphService, IActivityRegistry activityRegistry, IIdentityGenerator identityGenerator) { _activityVisitor = activityVisitor; _identityGraphService = identityGraphService; _activityRegistry = activityRegistry; + _identityGenerator = identityGenerator; Result = new Variable(); } @@ -72,28 +74,22 @@ public class WorkflowBuilder : IWorkflowBuilder var variable = new Variable(); Variables.Add(variable); variable.WithWorkflowStorage(); + variable.Id = null!; // This ensures that a deterministic ID is assigned by the builder. return variable; } /// public Variable WithVariable(string name, T value) { - var variable = new Variable - { - Name = name, - Value = value - }.WithWorkflowStorage(); - - Variables.Add(variable); + var variable = WithVariable(); return variable; } /// public Variable WithVariable(T value) { - var variable = value != null ? new Variable(value) : new Variable(); - variable.WithWorkflowStorage(); - Variables.Add(variable); + var variable = WithVariable(); + variable.Value = value; return variable; } @@ -135,8 +131,8 @@ public class WorkflowBuilder : IWorkflowBuilder /// public async Task BuildWorkflowAsync(CancellationToken cancellationToken = default) { - var definitionId = DefinitionId ?? Guid.NewGuid().ToString("N"); - var id = Id ?? Guid.NewGuid().ToString("N"); + var definitionId = DefinitionId ?? _identityGenerator.GenerateId(); + var id = Id ?? _identityGenerator.GenerateId(); var root = Root ?? new Sequence(); var identity = new WorkflowIdentity(definitionId, Version, id); var publication = WorkflowPublication.LatestAndPublished;