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