Aurora.Workflows.Tasks.Workflow
0.5.1.22
See the version list below for details.
dotnet add package Aurora.Workflows.Tasks.Workflow --version 0.5.1.22
NuGet\Install-Package Aurora.Workflows.Tasks.Workflow -Version 0.5.1.22
<PackageReference Include="Aurora.Workflows.Tasks.Workflow" Version="0.5.1.22" />
<PackageVersion Include="Aurora.Workflows.Tasks.Workflow" Version="0.5.1.22" />
<PackageReference Include="Aurora.Workflows.Tasks.Workflow" />
paket add Aurora.Workflows.Tasks.Workflow --version 0.5.1.22
#r "nuget: Aurora.Workflows.Tasks.Workflow, 0.5.1.22"
#:package Aurora.Workflows.Tasks.Workflow@0.5.1.22
#addin nuget:?package=Aurora.Workflows.Tasks.Workflow&version=0.5.1.22
#tool nuget:?package=Aurora.Workflows.Tasks.Workflow&version=0.5.1.22
Aurora Workflows
A versatile C# workflow engine designed to streamline task management. Easily define and execute workflows with built-in tasks or customize your own to fit specific needs. Perfect for automating processes and improving efficiency in any application.
Project website: https://aurora.unex.me/workflows
Features
- Generic Workflow Management: Create and manage workflows with ease.
- Built-in Tasks: Use predefined tasks for common operations.
- Custom Tasks: Define your own tasks to handle specific requirements.
- Extensible: Easily extend the engine to fit your unique use cases.
- Simple Integration: Integrate seamlessly with your existing C# applications.
Getting Started
Installation
You can install the workflow engine via NuGet Package Manager:
dotnet add package Aurora.Workflows
dotnet add package Aurora.Workflows.Tasks # 70+ built-in tasks
dotnet add package Aurora.Workflows.Fluent # fluent builder API
dotnet add package Aurora.Workflows.Contracts # only this is needed to write custom tasks
Building and running a workflow (Fluent API)
A root StartTask is created automatically. String arguments are expression-capable: plain text, or a C# expression that is evaluated by Roslyn at runtime.
using Aurora.Workflows.Fluent;
using Aurora.Workflows.Tasks;
var workflow = FluentWorkflow
.Create("Daily Report")
.TriggerOnSchedule("0 0 7 * * ?") // Quartz cron: every day at 07:00
.Set("hour", "DateTime.Now.Hour") // SetVariableTask – always an expression
.If("context.Get<int>(\"hour\") < 12",
then: t => t.Print("Good morning!"),
@else: t => t.Print("Hello!"))
.ReadFile(@"C:\data\report.txt", outputVariable: "report")
.Do<GreetTask>(t => t.Greeting = "=context.Get<string>(\"report\")") // custom task, see below
.WithOutput("greeting")
.Retry(TimeSpan.FromSeconds(5), maxRetries: 3)
.WriteFile(@"C:\data\greeting.txt", inputVariable: "greeting")
.Build();
await workflow.StartAsync();
// Persist / restore as JSON
string json = FluentWorkflow.Create("Persisted").TriggerOnce().Print("Hi").Persist();
var restored = FluentWorkflow.Load(json).Build();
Writing a custom task
Derive from WorkflowTaskBase. Every string property of a task may contain plain text or a C# expression prefixed with = – the user decides in the designer. Therefore such properties are never read directly but passed through Resolve<T>(), which returns plain text as-is and compiles/evaluates = expressions (e.g. =context.Get<string>("userName")). Data flows between tasks via GetInput<T>() / SetOutput(), which honour scope and variable-name settings.
using System.ComponentModel;
using System.Threading.Tasks;
using Aurora.Workflows.Contracts;
using Aurora.Workflows.Contracts.Attributes;
[WorkflowTaskCategory("My Category")]
[WorkflowTaskInputDefinition(typeof(string), Description = "The name to greet (output of the previous task).")]
[WorkflowTaskOutputDefinition(typeof(string), IsDefault = true, Description = "The composed greeting text.")]
public sealed class GreetTask : WorkflowTaskBase
{
// Expression-capable: "Hello" (plain text) or
// "=DateTime.Now.Hour < 12 ? \"Good morning\" : \"Hello\"" (evaluated at runtime).
[Description("Greeting prefix. Plain text or a '=' prefixed C# expression.")]
public string Greeting { get; set; } = "Hello";
// Non-string properties are used directly.
public bool Exclaim { get; set; } = true;
public GreetTask() { Name = "Greet Task"; }
protected override Task<bool> DoAsync(IWorkflowDataContext context)
{
var name = GetInput<string>(context) ?? "World"; // previous task's output
var greeting = Resolve<string>(Greeting, context); // text or evaluated expression
SetOutput(context, $"{greeting}, {name}{(Exclaim ? "!" : ".")}");
return Task.FromResult(true);
}
protected override Task<bool> DoSetupAsync() => Task.FromResult(true); // before first run
protected override Task<bool> DoTearDownAsync() => Task.FromResult(true); // on workflow stop
}
Scope tasks with child tasks (loops, conditionals, transactions) derive from TransactionScopeTaskBase instead. Full documentation: https://aurora.unex.me/workflows
Tip: developing custom tasks in a class library? Add a reference to
Aurora.Workflows.UI.Hostso pressing F5 opens the visual designer with your project already loaded for interactive debugging.
License
Aurora Workflows is free to use in full for non-commercial projects. For commercial use, please get in touch to discuss licensing terms; redistribution, modification, decompilation, reverse-engineering, or publication of the software without explicit written permission is strictly prohibited.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0-windows7.0 is compatible. net9.0-windows was computed. net10.0-windows was computed. |
-
net8.0-windows7.0
- Aurora.Workflows (>= 0.5.1.22)
- Aurora.Workflows.Extensions (>= 0.5.1.22)
- Aurora.Workflows.UI.Core (>= 0.5.1.22)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.5.1.24 | 86 | 9/18/2026 |
| 0.5.1.23 | 90 | 9/18/2026 |
| 0.5.1.22 | 95 | 9/17/2026 |
| 0.5.1.20 | 89 | 9/16/2026 |
| 0.5.1.19 | 93 | 9/16/2026 |
| 0.5.1.15 | 90 | 9/15/2026 |
| 0.5.1.10 | 88 | 9/14/2026 |
| 0.5.1.4 | 116 | 9/7/2026 |
| 0.5.1.1 | 105 | 9/3/2026 |
| 0.4.1.30 | 105 | 9/3/2026 |
| 0.4.1.29 | 104 | 8/27/2026 |
| 0.4.1.22 | 113 | 8/12/2026 |
| 0.4.1.21 | 119 | 8/4/2026 |
| 0.4.1.20 | 127 | 7/23/2026 |
| 0.4.1.19 | 126 | 7/16/2026 |
| 0.4.1.18 | 133 | 6/27/2026 |
| 0.4.1.16 | 122 | 6/26/2026 |
| 0.4.1.14 | 131 | 5/11/2026 |
| 0.4.1.12 | 127 | 5/9/2026 |
| 0.4.1.11 | 118 | 5/6/2026 |