From 43cfe431f1b116a76735496268c523ca2e04266d Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 3 Dec 2020 19:49:12 +0100 Subject: [PATCH] Make descriptor building resilient --- .../Services/Models/ActivityBlueprintWrapper.cs | 13 +++++++++++-- .../Services/Models/IActivityBlueprintWrapper.cs | 2 +- .../Activities/CountDownActivity.cs | 5 ++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/core/Elsa.Abstractions/Services/Models/ActivityBlueprintWrapper.cs b/src/core/Elsa.Abstractions/Services/Models/ActivityBlueprintWrapper.cs index b8b37102a..0e9c71c8d 100644 --- a/src/core/Elsa.Abstractions/Services/Models/ActivityBlueprintWrapper.cs +++ b/src/core/Elsa.Abstractions/Services/Models/ActivityBlueprintWrapper.cs @@ -25,11 +25,20 @@ namespace Elsa.Services.Models { } - public async ValueTask GetPropertyValueAsync(Expression> propertyExpression, CancellationToken cancellationToken = default) + public async ValueTask GetPropertyValueAsync(Expression> propertyExpression, CancellationToken cancellationToken = default) { var workflowBlueprint = ActivityExecutionContext.WorkflowExecutionContext.WorkflowBlueprint; var activityId = ActivityExecutionContext.ActivityBlueprint.Id; - return await workflowBlueprint.GetActivityPropertyValue(activityId, propertyExpression, ActivityExecutionContext, cancellationToken); + + // Computed property setters that depend on actual workflow state might fault, since we are using a fake activity execution context. + try + { + return await workflowBlueprint.GetActivityPropertyValue(activityId, propertyExpression, ActivityExecutionContext, cancellationToken); + } + catch (Exception e) + { + return default; + } } public T? GetState(Expression> propertyExpression) diff --git a/src/core/Elsa.Abstractions/Services/Models/IActivityBlueprintWrapper.cs b/src/core/Elsa.Abstractions/Services/Models/IActivityBlueprintWrapper.cs index d404d57ce..271f9f518 100644 --- a/src/core/Elsa.Abstractions/Services/Models/IActivityBlueprintWrapper.cs +++ b/src/core/Elsa.Abstractions/Services/Models/IActivityBlueprintWrapper.cs @@ -13,7 +13,7 @@ namespace Elsa.Services.Models public interface IActivityBlueprintWrapper : IActivityBlueprintWrapper where TActivity:IActivity { - ValueTask GetPropertyValueAsync(Expression> propertyExpression, CancellationToken cancellationToken = default); + ValueTask GetPropertyValueAsync(Expression> propertyExpression, CancellationToken cancellationToken = default); T? GetState(Expression> propertyExpression); } } \ No newline at end of file diff --git a/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Activities/CountDownActivity.cs b/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Activities/CountDownActivity.cs index 33ab80ab5..c7cb8427c 100644 --- a/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Activities/CountDownActivity.cs +++ b/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Activities/CountDownActivity.cs @@ -17,11 +17,14 @@ namespace Elsa.Samples.ProgrammaticCompositeActivitiesConsole.Activities public override void Build(ICompositeActivityBuilder composite) { composite - .WriteLine("Turn left or right?") + .StartWith(GetInstructions) + .WriteLine(context => (string)context.Input) .ReadLine() .Finish(context => (string) context.Input); } protected override IActivityExecutionResult Complete(ActivityExecutionContext context) => Outcome(((string) context.WorkflowExecutionContext.WorkflowInstance.Output)!); + + private static void GetInstructions(ActivityExecutionContext context) => context.Output = "Turn left or right?"; } } \ No newline at end of file