Make descriptor building resilient

This commit is contained in:
Sipke Schoorstra 2020-12-03 19:49:12 +01:00
parent 17eea86c70
commit 43cfe431f1
3 changed files with 16 additions and 4 deletions

View file

@ -25,11 +25,20 @@ namespace Elsa.Services.Models
{
}
public async ValueTask<T> GetPropertyValueAsync<T>(Expression<Func<TActivity, T>> propertyExpression, CancellationToken cancellationToken = default)
public async ValueTask<T?> GetPropertyValueAsync<T>(Expression<Func<TActivity, T>> 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<T>(Expression<Func<TActivity, T>> propertyExpression)

View file

@ -13,7 +13,7 @@ namespace Elsa.Services.Models
public interface IActivityBlueprintWrapper<TActivity> : IActivityBlueprintWrapper where TActivity:IActivity
{
ValueTask<T> GetPropertyValueAsync<T>(Expression<Func<TActivity, T>> propertyExpression, CancellationToken cancellationToken = default);
ValueTask<T?> GetPropertyValueAsync<T>(Expression<Func<TActivity, T>> propertyExpression, CancellationToken cancellationToken = default);
T? GetState<T>(Expression<Func<TActivity, T>> propertyExpression);
}
}

View file

@ -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?";
}
}