GitHub - danielgerlag/workflow-core: Lightweight workflow engine for .NET Standard (original) (raw)

Workflow Core

Build status

Workflow Core is a light weight embeddable workflow engine targeting .NET Standard. Think: long running processes with multiple tasks that need to track state. It supports pluggable persistence and concurrency providers to allow for multi-node clusters.

Announcements

Conductor is a stand-alone workflow server as opposed to a library that uses Workflow Core internally. It exposes an API that allows you to store workflow definitions, track running workflows, manage events and define custom steps and scripts for usage in your workflows.

https://github.com/danielgerlag/conductor

Documentation

See Tutorial here.

Fluent API

Define your workflows with the fluent API.

public class MyWorkflow : IWorkflow { public void Build(IWorkflowBuilder builder) {
builder .StartWith() .Then() .Then(); } }

JSON / YAML Workflow Definitions

Define your workflows in JSON or YAML, need to install WorkFlowCore.DSL

{ "Id": "HelloWorld", "Version": 1, "Steps": [ { "Id": "Hello", "StepType": "MyApp.HelloWorld, MyApp", "NextStepId": "Bye" },
{ "Id": "Bye", "StepType": "MyApp.GoodbyeWorld, MyApp" } ] }

Id: HelloWorld Version: 1 Steps:

Sample use cases

public class MyData { public string Email { get; set; } public string Password { get; set; } public string UserId { get; set; } }

public class MyWorkflow : IWorkflow { public void Build(IWorkflowBuilder builder) {
builder .StartWith() .Input(step => step.Email, data => data.Email) .Input(step => step.Password, data => data.Password) .Output(data => data.UserId, step => step.UserId) .Then() .WaitFor("confirmation", data => data.UserId) .Then() .Input(step => step.UserId, data => data.UserId); } }

public class MyWorkflow : IWorkflow { public void Build(IWorkflowBuilder builder) {
builder .StartWith() .Then() .OnError(WorkflowErrorHandling.Retry, TimeSpan.FromMinutes(10)) .Then() .OnError(WorkflowErrorHandling.Retry, TimeSpan.FromMinutes(10)); } }

builder .StartWith() .Saga(saga => saga .StartWith() .CompensateWith() .Then() .CompensateWith() .Then() .CompensateWith() ) .OnError(Models.WorkflowErrorHandling.Retry, TimeSpan.FromMinutes(10)) .Then();

Persistence

Since workflows are typically long running processes, they will need to be persisted to storage between steps. There are several persistence providers available as separate Nuget packages.

A search index provider can be plugged in to Workflow Core, enabling you to index your workflows and search against the data and state of them. These are also available as separate Nuget packages.

Extensions

Samples

Contributors

Ports

License

This project is licensed under the MIT License - see the LICENSE.md file for details