diff --git a/src/core/Elsa.Abstractions/Services/CompositeActivity.cs b/src/core/Elsa.Abstractions/Services/CompositeActivity.cs index bb8882b63..836e3d6c4 100644 --- a/src/core/Elsa.Abstractions/Services/CompositeActivity.cs +++ b/src/core/Elsa.Abstractions/Services/CompositeActivity.cs @@ -40,9 +40,7 @@ namespace Elsa.Services if (finishOutput != null) { - if(!string.IsNullOrWhiteSpace(finishOutput.Outcome)) - outcomes.Add(finishOutput.Outcome!); - + outcomes.AddRange(finishOutput.Outcomes); output = finishOutput.Output; } diff --git a/src/core/Elsa.Core/Activities/ControlFlow/Finish/FinishBuilderExtensions.cs b/src/core/Elsa.Core/Activities/ControlFlow/Finish/FinishBuilderExtensions.cs index 178031050..2e364dd59 100644 --- a/src/core/Elsa.Core/Activities/ControlFlow/Finish/FinishBuilderExtensions.cs +++ b/src/core/Elsa.Core/Activities/ControlFlow/Finish/FinishBuilderExtensions.cs @@ -13,29 +13,29 @@ namespace Elsa.Activities.ControlFlow { public static IActivityBuilder Finish(this IBuilder builder, Action>? setup = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => builder.Then(setup, null, lineNumber, sourceFile); - - public static IActivityBuilder Finish(this IBuilder builder, Func> output, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.Finish(activity => activity.WithOutput(output), lineNumber, sourceFile); - - public static IActivityBuilder Finish(this IBuilder builder, Func output, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.Finish(activity => activity.WithOutput(output), lineNumber, sourceFile); - - public static IActivityBuilder Finish(this IBuilder builder, Func output, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.Finish(activity => activity.WithOutput(output), lineNumber, sourceFile); - - public static IActivityBuilder Finish(this IBuilder builder, object? output, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.Finish(activity => activity.WithOutput(output), lineNumber, sourceFile); - + public static IActivityBuilder Finish(this IBuilder builder, Func?>> outcomes, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.Finish(activity => activity.WithOutcome(outcomes), lineNumber, sourceFile); + builder.Finish(activity => activity.WithOutcomes(outcomes), lineNumber, sourceFile); public static IActivityBuilder Finish(this IBuilder builder, Func> outcomes, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.Finish(activity => activity.WithOutcome(outcomes), lineNumber, sourceFile); + builder.Finish(activity => activity.WithOutcomes(outcomes), lineNumber, sourceFile); public static IActivityBuilder Finish(this IBuilder builder, Func> outcomes, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.Finish(activity => activity.WithOutcome(outcomes), lineNumber, sourceFile); + builder.Finish(activity => activity.WithOutcomes(outcomes), lineNumber, sourceFile); public static IActivityBuilder Finish(this IBuilder builder, IEnumerable outcomes, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => - builder.Finish(activity => activity.WithOutcome(outcomes), lineNumber, sourceFile); + builder.Finish(activity => activity.WithOutcomes(outcomes), lineNumber, sourceFile); + + public static IActivityBuilder Finish(this IBuilder builder, Func> outcome, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.Finish(activity => activity.WithOutcome(outcome), lineNumber, sourceFile); + + public static IActivityBuilder Finish(this IBuilder builder, Func outcome, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.Finish(activity => activity.WithOutcome(outcome), lineNumber, sourceFile); + + public static IActivityBuilder Finish(this IBuilder builder, Func outcome, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.Finish(activity => activity.WithOutcome(outcome), lineNumber, sourceFile); + + public static IActivityBuilder Finish(this IBuilder builder, string outcome, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.Finish(activity => activity.WithOutcome(outcome), lineNumber, sourceFile); } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Activities/ControlFlow/Finish/FinishExtensions.cs b/src/core/Elsa.Core/Activities/ControlFlow/Finish/FinishExtensions.cs index 8e3982191..e84dc47dc 100644 --- a/src/core/Elsa.Core/Activities/ControlFlow/Finish/FinishExtensions.cs +++ b/src/core/Elsa.Core/Activities/ControlFlow/Finish/FinishExtensions.cs @@ -13,10 +13,15 @@ namespace Elsa.Activities.ControlFlow public static ISetupActivity WithOutput(this ISetupActivity activity, Func value) => activity.Set(x => x.OutputValue, value); public static ISetupActivity WithOutput(this ISetupActivity activity, Func value) => activity.Set(x => x.OutputValue, value); public static ISetupActivity WithOutput(this ISetupActivity activity, object? value) => activity.Set(x => x.OutputValue, value); - - public static ISetupActivity WithOutcome(this ISetupActivity activity, Func?>> value) => activity.Set(x => x.OutcomeNames, value); - public static ISetupActivity WithOutcome(this ISetupActivity activity, Func> value) => activity.Set(x => x.OutcomeNames, value); - public static ISetupActivity WithOutcome(this ISetupActivity activity, Func> value) => activity.Set(x => x.OutcomeNames, value); - public static ISetupActivity WithOutcome(this ISetupActivity activity, IEnumerable value) => activity.Set(x => x.OutcomeNames, value); + + public static ISetupActivity WithOutcomes(this ISetupActivity activity, Func?>> value) => activity.Set(x => x.OutcomeNames, value); + public static ISetupActivity WithOutcomes(this ISetupActivity activity, Func> value) => activity.Set(x => x.OutcomeNames, value); + public static ISetupActivity WithOutcomes(this ISetupActivity activity, Func> value) => activity.Set(x => x.OutcomeNames, value); + public static ISetupActivity WithOutcomes(this ISetupActivity activity, IEnumerable value) => activity.Set(x => x.OutcomeNames, value); + + public static ISetupActivity WithOutcome(this ISetupActivity activity, Func> value) => activity.WithOutcomes(async x => new[] { await value(x) }); + public static ISetupActivity WithOutcome(this ISetupActivity activity, Func value) => activity.WithOutcomes(x => new[] { value(x) }); + public static ISetupActivity WithOutcome(this ISetupActivity activity, Func value) => activity.WithOutcomes(() => new[] { value() }); + public static ISetupActivity WithOutcome(this ISetupActivity activity, string value) => activity.WithOutcomes(new[] { value }); } } \ 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 5fa9f892e..4474417cf 100644 --- a/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Activities/CountdownActivity.cs +++ b/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Activities/CountdownActivity.cs @@ -23,6 +23,8 @@ namespace Elsa.Samples.ProgrammaticCompositeActivitiesConsole.Activities public override void Build(ICompositeActivityBuilder activity) { activity + // IMPORTANT: Notice that we need to get the "parent" state to get the `Start` value, since here we are in a different context than the CountDownActivity itself. + // Accessing `Start` directly would return the captured value at the time this `Build` method executed when creating workflow blueprints. .For(context => context.GetParentState(nameof(Start)), _ => 0, _ => -1, iterate => { iterate.WriteLine(context => $"{context.GetInput()}..."); diff --git a/test/integration/Elsa.Core.IntegrationTests/Workflows/FinishWorkflow.cs b/test/integration/Elsa.Core.IntegrationTests/Workflows/FinishWorkflow.cs index e0d757f68..0eedaeeaf 100644 --- a/test/integration/Elsa.Core.IntegrationTests/Workflows/FinishWorkflow.cs +++ b/test/integration/Elsa.Core.IntegrationTests/Workflows/FinishWorkflow.cs @@ -7,6 +7,6 @@ namespace Elsa.Core.IntegrationTests.Workflows { private readonly object _output; public FinishWorkflow(object output) => _output = output; - public void Build(IWorkflowBuilder builder) => builder.Finish(_output); + public void Build(IWorkflowBuilder builder) => builder.Finish(finish => finish.WithOutput(_output)); } } \ No newline at end of file