From 9a0e6098005d62a22172cb6ed7cdc46031e7fe2d Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sat, 22 Apr 2023 00:02:02 +0200 Subject: [PATCH] Add various sample projects --- .../Activities/MyEvent.cs | 11 ++++ .../Elsa.Samples.Bookmarks.csproj | 15 ++++++ .../console/Elsa.Samples.Bookmarks/Program.cs | 42 +++++++++++++++ .../Program.cs | 2 +- .../Activities/Sum.cs | 28 ++++++++++ .../Elsa.Samples.CustomActivities.csproj | 15 ++++++ .../Elsa.Samples.CustomActivities/Program.cs | 43 ++++++++++++++++ .../Elsa.Samples.FlowchartWorkflows.csproj | 15 ++++++ .../Program.cs | 51 +++++++++++++++++++ .../Elsa.Samples.LoopingWorkflows/Program.cs | 9 ++-- .../Workflows/ForEachWorkflow.cs | 8 +-- .../Workflows/ForWorkflow.cs | 8 +-- .../Workflows/HelloWorkflow.cs | 24 +++++++++ .../Elsa.Samples.WorkflowFunctions/Program.cs | 4 +- .../Dockerfile | 18 +++++++ .../Elsa.Samples.WorkflowInputOutput.csproj | 15 ++++++ .../Program.cs | 40 +++++++++++++++ 17 files changed, 328 insertions(+), 20 deletions(-) create mode 100644 src/samples/console/Elsa.Samples.Bookmarks/Activities/MyEvent.cs create mode 100644 src/samples/console/Elsa.Samples.Bookmarks/Elsa.Samples.Bookmarks.csproj create mode 100644 src/samples/console/Elsa.Samples.Bookmarks/Program.cs create mode 100644 src/samples/console/Elsa.Samples.CustomActivities/Activities/Sum.cs create mode 100644 src/samples/console/Elsa.Samples.CustomActivities/Elsa.Samples.CustomActivities.csproj create mode 100644 src/samples/console/Elsa.Samples.CustomActivities/Program.cs create mode 100644 src/samples/console/Elsa.Samples.FlowchartWorkflows/Elsa.Samples.FlowchartWorkflows.csproj create mode 100644 src/samples/console/Elsa.Samples.FlowchartWorkflows/Program.cs create mode 100644 src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/HelloWorkflow.cs create mode 100644 src/samples/console/Elsa.Samples.WorkflowInputOutput/Dockerfile create mode 100644 src/samples/console/Elsa.Samples.WorkflowInputOutput/Elsa.Samples.WorkflowInputOutput.csproj create mode 100644 src/samples/console/Elsa.Samples.WorkflowInputOutput/Program.cs diff --git a/src/samples/console/Elsa.Samples.Bookmarks/Activities/MyEvent.cs b/src/samples/console/Elsa.Samples.Bookmarks/Activities/MyEvent.cs new file mode 100644 index 000000000..3ef2f8791 --- /dev/null +++ b/src/samples/console/Elsa.Samples.Bookmarks/Activities/MyEvent.cs @@ -0,0 +1,11 @@ +using Elsa.Workflows.Core.Models; + +namespace Elsa.Samples.Bookmarks.Activities; + +public class MyEvent : Activity +{ + protected override void Execute(ActivityExecutionContext context) + { + context.CreateBookmark(); + } +} \ No newline at end of file diff --git a/src/samples/console/Elsa.Samples.Bookmarks/Elsa.Samples.Bookmarks.csproj b/src/samples/console/Elsa.Samples.Bookmarks/Elsa.Samples.Bookmarks.csproj new file mode 100644 index 000000000..f7078935e --- /dev/null +++ b/src/samples/console/Elsa.Samples.Bookmarks/Elsa.Samples.Bookmarks.csproj @@ -0,0 +1,15 @@ + + + + Exe + net7.0 + enable + enable + false + + + + + + + diff --git a/src/samples/console/Elsa.Samples.Bookmarks/Program.cs b/src/samples/console/Elsa.Samples.Bookmarks/Program.cs new file mode 100644 index 000000000..0fb967a7e --- /dev/null +++ b/src/samples/console/Elsa.Samples.Bookmarks/Program.cs @@ -0,0 +1,42 @@ +using Elsa.Extensions; +using Elsa.Samples.Bookmarks.Activities; +using Elsa.Workflows.Core.Activities; +using Elsa.Workflows.Core.Contracts; +using Elsa.Workflows.Core.Models; +using Microsoft.Extensions.DependencyInjection; + +// Setup service container. +var services = new ServiceCollection(); + +// Add Elsa services. +services.AddElsa(); + +// Build service container. +var serviceProvider = services.BuildServiceProvider(); + +// Resolve a workflow runner to run the workflow. +var workflowRunner = serviceProvider.GetRequiredService(); + +// Create a workflow. + +var workflow = new Workflow +{ + Root = new Sequence + { + Activities = + { + new WriteLine("Hello World!"), + new MyEvent(), // Blocks until the event bookmark is resumed. + new WriteLine("Event received!") + } + } +}; + +// Run the workflow. +var result = await workflowRunner.RunAsync(workflow); + +// Resume the workflow using te created bookmark. +var bookmark = result.WorkflowState.Bookmarks.Single(); +var workflowState = result.WorkflowState; +await workflowRunner.RunAsync(workflow, workflowState, new RunWorkflowOptions(bookmarkId: bookmark.Id)); + diff --git a/src/samples/console/Elsa.Samples.ConditionalWorkflows/Program.cs b/src/samples/console/Elsa.Samples.ConditionalWorkflows/Program.cs index f62e03fa6..9c266773e 100644 --- a/src/samples/console/Elsa.Samples.ConditionalWorkflows/Program.cs +++ b/src/samples/console/Elsa.Samples.ConditionalWorkflows/Program.cs @@ -30,7 +30,7 @@ var workflow = new Sequence new If { // If aged 18 or up, beer is provided, soda otherwise. - Condition = new Input(context => ageVariable.Get(context) < 18), + Condition = new (context => ageVariable.Get(context) < 18), Then = new WriteLine("Enjoy your soda!"), Else = new WriteLine("Enjoy your beer!") }, diff --git a/src/samples/console/Elsa.Samples.CustomActivities/Activities/Sum.cs b/src/samples/console/Elsa.Samples.CustomActivities/Activities/Sum.cs new file mode 100644 index 000000000..4fd8bfbf6 --- /dev/null +++ b/src/samples/console/Elsa.Samples.CustomActivities/Activities/Sum.cs @@ -0,0 +1,28 @@ +using Elsa.Extensions; +using Elsa.Workflows.Core.Models; + +namespace Elsa.Samples.CustomActivities.Activities; + +/// +/// Sums two numbers. +/// +public class Sum : CodeActivity +{ + public Sum(Variable a, Variable b, Variable result) + { + A = new(a); + B = new(b); + Result = new(result); + } + + public Input A { get; set; } = default!; + public Input B { get; set; } = default!; + + protected override void Execute(ActivityExecutionContext context) + { + var input1 = A.Get(context); + var input2 = B.Get(context); + var result = input1 + input2; + context.SetResult(result); + } +} \ No newline at end of file diff --git a/src/samples/console/Elsa.Samples.CustomActivities/Elsa.Samples.CustomActivities.csproj b/src/samples/console/Elsa.Samples.CustomActivities/Elsa.Samples.CustomActivities.csproj new file mode 100644 index 000000000..f7078935e --- /dev/null +++ b/src/samples/console/Elsa.Samples.CustomActivities/Elsa.Samples.CustomActivities.csproj @@ -0,0 +1,15 @@ + + + + Exe + net7.0 + enable + enable + false + + + + + + + diff --git a/src/samples/console/Elsa.Samples.CustomActivities/Program.cs b/src/samples/console/Elsa.Samples.CustomActivities/Program.cs new file mode 100644 index 000000000..e2e39614e --- /dev/null +++ b/src/samples/console/Elsa.Samples.CustomActivities/Program.cs @@ -0,0 +1,43 @@ +using Elsa.Extensions; +using Elsa.Samples.CustomActivities.Activities; +using Elsa.Workflows.Core.Activities; +using Elsa.Workflows.Core.Contracts; +using Elsa.Workflows.Core.Models; +using Microsoft.Extensions.DependencyInjection; + +// Setup service container. +var services = new ServiceCollection(); + +// Add Elsa services. +services.AddElsa(); + +// Build service container. +var serviceProvider = services.BuildServiceProvider(); + +// Resolve a workflow runner to run the workflow. +var workflowRunner = serviceProvider.GetRequiredService(); + +// Create a workflow. +var a = new Variable(); +var b = new Variable(); +var sum = new Variable(); + +var workflow = new Workflow +{ + Root = new Sequence + { + Variables = {a, b, sum}, + Activities = + { + new WriteLine("Enter first value"), + new ReadLine(a), + new WriteLine("Enter second value"), + new ReadLine(b), + new Sum(a, b, sum), + new WriteLine(context => $"The sum of {a.Get(context)} and {b.Get(context)} is {sum.Get(context)}") + } + } +}; + +// Run the workflow. +await workflowRunner.RunAsync(workflow); \ No newline at end of file diff --git a/src/samples/console/Elsa.Samples.FlowchartWorkflows/Elsa.Samples.FlowchartWorkflows.csproj b/src/samples/console/Elsa.Samples.FlowchartWorkflows/Elsa.Samples.FlowchartWorkflows.csproj new file mode 100644 index 000000000..f7078935e --- /dev/null +++ b/src/samples/console/Elsa.Samples.FlowchartWorkflows/Elsa.Samples.FlowchartWorkflows.csproj @@ -0,0 +1,15 @@ + + + + Exe + net7.0 + enable + enable + false + + + + + + + diff --git a/src/samples/console/Elsa.Samples.FlowchartWorkflows/Program.cs b/src/samples/console/Elsa.Samples.FlowchartWorkflows/Program.cs new file mode 100644 index 000000000..9718bc4cc --- /dev/null +++ b/src/samples/console/Elsa.Samples.FlowchartWorkflows/Program.cs @@ -0,0 +1,51 @@ +using Elsa.Extensions; +using Elsa.Workflows.Core.Activities; +using Elsa.Workflows.Core.Activities.Flowchart.Activities; +using Elsa.Workflows.Core.Activities.Flowchart.Models; +using Elsa.Workflows.Core.Contracts; +using Elsa.Workflows.Core.Models; +using Microsoft.Extensions.DependencyInjection; + +// Setup service container. +var services = new ServiceCollection(); + +// Add Elsa services. +services.AddElsa(); + +// Build service container. +var serviceProvider = services.BuildServiceProvider(); + +// Define a workflow variable to capture the output of the ReadLine activity. +var nameVariable = new Variable(); + +// Create a workflow. +var writeLine1 = new WriteLine("Please tell me your name:"); +var writeLine2 = new ReadLine(nameVariable); +var writeLine3 = new WriteLine(context => $"Nice to meet you, {nameVariable.Get(context)}!"); + +var workflow = new Flowchart +{ + // Register the name variable. + Variables = { nameVariable }, + + // Add the activities. + Activities = + { + writeLine1, + writeLine2, + writeLine3 + }, + + // Setup the connections between activities. + Connections = + { + new Connection(writeLine1, writeLine2), + new Connection(writeLine2, writeLine3) + } +}; + +// Resolve a workflow runner to run the workflow. +var workflowRunner = serviceProvider.GetRequiredService(); + +// Run the workflow. +await workflowRunner.RunAsync(workflow); \ No newline at end of file diff --git a/src/samples/console/Elsa.Samples.LoopingWorkflows/Program.cs b/src/samples/console/Elsa.Samples.LoopingWorkflows/Program.cs index af7610492..7069818c3 100644 --- a/src/samples/console/Elsa.Samples.LoopingWorkflows/Program.cs +++ b/src/samples/console/Elsa.Samples.LoopingWorkflows/Program.cs @@ -15,11 +15,14 @@ var serviceProvider = services.BuildServiceProvider(); // Resolve a workflow runner to run the workflow. var workflowRunner = serviceProvider.GetRequiredService(); +// Run the Hello workflow. +await workflowRunner.RunUntilEndAsync(HelloWorkflow.Create()); + // Run the For workflow. -await workflowRunner.RunAsync(ForWorkflow.Create()); +await workflowRunner.RunUntilEndAsync(ForWorkflow.Create()); // Run the For Each workflow. -await workflowRunner.RunAsync(ForEachWorkflow.Create()); +await workflowRunner.RunUntilEndAsync(ForEachWorkflow.Create()); // Run the While workflow. -await workflowRunner.RunAsync(WhileWorkflow.Create()); \ No newline at end of file +await workflowRunner.RunUntilEndAsync(WhileWorkflow.Create()); \ No newline at end of file diff --git a/src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/ForEachWorkflow.cs b/src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/ForEachWorkflow.cs index 4ab2d14e8..753b69695 100644 --- a/src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/ForEachWorkflow.cs +++ b/src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/ForEachWorkflow.cs @@ -27,13 +27,7 @@ public static class ForEachWorkflow Activities = { new WriteLine(context => $"- [ ] {currentValueVariable.Get(context)}"), - new Delay - { - // The strategy determines whether the workflow should suspend or wait synchronously. - // For console applications without a host, long-running workflows aren't supported, so we use the Blocking strategy. - Strategy = new(DelayBlockingStrategy.Blocking), - TimeSpan = new Input(TimeSpan.FromMilliseconds(250)) - } + new Delay(TimeSpan.FromMilliseconds(250)) } } }, diff --git a/src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/ForWorkflow.cs b/src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/ForWorkflow.cs index be29f33ba..ba560b538 100644 --- a/src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/ForWorkflow.cs +++ b/src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/ForWorkflow.cs @@ -26,13 +26,7 @@ public static class ForWorkflow Activities = { new WriteLine(context => $"Current value: {currentValueVariable.Get(context)}"), - new Delay - { - // The strategy determines whether the workflow should suspend or wait synchronously. - // For console applications without a host, long-running workflows aren't supported, so we use the Blocking strategy. - Strategy = new(DelayBlockingStrategy.Blocking), - TimeSpan = new Input(TimeSpan.FromSeconds(1)) - } + new Delay(TimeSpan.FromSeconds(1)) } } }, diff --git a/src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/HelloWorkflow.cs b/src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/HelloWorkflow.cs new file mode 100644 index 000000000..33c827e02 --- /dev/null +++ b/src/samples/console/Elsa.Samples.LoopingWorkflows/Workflows/HelloWorkflow.cs @@ -0,0 +1,24 @@ +using Elsa.Workflows.Core.Activities; +using Elsa.Workflows.Core.Contracts; +using Elsa.Workflows.Core.Models; + +namespace Elsa.Samples.LoopingWorkflows.Workflows; + +/// +/// Demonstrates dynamic workflow creation. +/// +public static class HelloWorkflow +{ + public static IActivity Create() + { + var messages = new[] { "Hello, world!", "Goodbye, cruel world..." }; + + return new Workflow + { + Root = new Sequence + { + Activities = messages.Select(x => new WriteLine(x)).ToArray() + } + }; + } +} \ No newline at end of file diff --git a/src/samples/console/Elsa.Samples.WorkflowFunctions/Program.cs b/src/samples/console/Elsa.Samples.WorkflowFunctions/Program.cs index 020fcccab..025bbf711 100644 --- a/src/samples/console/Elsa.Samples.WorkflowFunctions/Program.cs +++ b/src/samples/console/Elsa.Samples.WorkflowFunctions/Program.cs @@ -27,11 +27,11 @@ Console.WriteLine("Result: {0}", result1.Result); // AddInputsWorkflow: Console.WriteLine("=== AddInputsWorkflow ==="); var input = new { a = 5.6, b = 9.4 }.ToDictionary(); -var result2 = await workflowRunner.RunAsync(new RunWorkflowOptions(Input: input)); +var result2 = await workflowRunner.RunAsync(new RunWorkflowOptions(input: input)); Console.WriteLine("Result: {0}", result2); // SumInputsWorkflow: Console.WriteLine("=== SumInputsWorkflow ==="); input = new { numbers = new[]{ 9.6f, 2.5f, 1.2f, 4.8f } }.ToDictionary(); -var result3 = await workflowRunner.RunAsync(new RunWorkflowOptions(Input: input)); +var result3 = await workflowRunner.RunAsync(new RunWorkflowOptions(input: input)); Console.WriteLine("Result: {0}", result3); \ No newline at end of file diff --git a/src/samples/console/Elsa.Samples.WorkflowInputOutput/Dockerfile b/src/samples/console/Elsa.Samples.WorkflowInputOutput/Dockerfile new file mode 100644 index 000000000..efefdc09d --- /dev/null +++ b/src/samples/console/Elsa.Samples.WorkflowInputOutput/Dockerfile @@ -0,0 +1,18 @@ +FROM mcr.microsoft.com/dotnet/runtime:7.0 AS base +WORKDIR /app + +FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +WORKDIR /src +COPY ["src/samples/console/Elsa.Samples.WorkflowInput/Elsa.Samples.WorkflowInput.csproj", "src/samples/console/Elsa.Samples.WorkflowInput/"] +RUN dotnet restore "src/samples/console/Elsa.Samples.WorkflowInput/Elsa.Samples.WorkflowInput.csproj" +COPY . . +WORKDIR "/src/src/samples/console/Elsa.Samples.WorkflowInput" +RUN dotnet build "Elsa.Samples.WorkflowInput.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "Elsa.Samples.WorkflowInput.csproj" -c Release -o /app/publish + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "Elsa.Samples.WorkflowInput.dll"] diff --git a/src/samples/console/Elsa.Samples.WorkflowInputOutput/Elsa.Samples.WorkflowInputOutput.csproj b/src/samples/console/Elsa.Samples.WorkflowInputOutput/Elsa.Samples.WorkflowInputOutput.csproj new file mode 100644 index 000000000..f7078935e --- /dev/null +++ b/src/samples/console/Elsa.Samples.WorkflowInputOutput/Elsa.Samples.WorkflowInputOutput.csproj @@ -0,0 +1,15 @@ + + + + Exe + net7.0 + enable + enable + false + + + + + + + diff --git a/src/samples/console/Elsa.Samples.WorkflowInputOutput/Program.cs b/src/samples/console/Elsa.Samples.WorkflowInputOutput/Program.cs new file mode 100644 index 000000000..3ed058187 --- /dev/null +++ b/src/samples/console/Elsa.Samples.WorkflowInputOutput/Program.cs @@ -0,0 +1,40 @@ +using Elsa.Extensions; +using Elsa.Workflows.Core.Activities; +using Elsa.Workflows.Core.Contracts; +using Microsoft.Extensions.DependencyInjection; + +// Setup service container. +var services = new ServiceCollection(); + +// Add Elsa services. +services.AddElsa(); + +// Build service container. +var serviceProvider = services.BuildServiceProvider(); + +// Create a workflow that echoes some message it receives via input. + +var workflow = new WriteLine(context => $"Echo: {context.GetInput("Message")}!"); + +// Resolve a workflow runner to run the workflow. +var workflowRunner = serviceProvider.GetRequiredService(); + +// Create an input dictionary. +var input = new Dictionary +{ + ["Message"] = "Hello World!" +}; + +// Run the workflow and provide the input. +await workflowRunner.RunAsync(workflow, new RunWorkflowOptions(input: input)); + +// Create a workflow that returns some output. +var workflow2 = new Inline(context => context.WorkflowExecutionContext.Output["Message"] = "Hello from workflow!"); + +// Run the workflow and hold on to its workflow state. +var result = await workflowRunner.RunAsync(workflow2); + +// Get the output. +var output = result.WorkflowState.Output["Message"]; + +Console.WriteLine($"Output: {output}"); \ No newline at end of file