{"id":13432051,"url":"https://github.com/danielgerlag/workflow-core","last_synced_at":"2025-05-12T03:46:10.553Z","repository":{"id":38915998,"uuid":"73864802","full_name":"danielgerlag/workflow-core","owner":"danielgerlag","description":"Lightweight workflow engine for .NET Standard","archived":false,"fork":false,"pushed_at":"2025-04-10T16:47:10.000Z","size":2138,"stargazers_count":5579,"open_issues_count":353,"forks_count":1234,"subscribers_count":226,"default_branch":"master","last_synced_at":"2025-05-01T13:52:24.936Z","etag":null,"topics":["hacktoberfest","saga","saga-transactions","workflow","workflow-engine"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danielgerlag.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["danielgerlag"]}},"created_at":"2016-11-15T23:32:24.000Z","updated_at":"2025-04-30T15:10:45.000Z","dependencies_parsed_at":"2023-02-14T19:01:58.364Z","dependency_job_id":"f7b3f247-58fc-42aa-b871-05df8eb9243f","html_url":"https://github.com/danielgerlag/workflow-core","commit_stats":{"total_commits":724,"total_committers":84,"mean_commits":8.619047619047619,"dds":0.5966850828729282,"last_synced_commit":"f7fc3aa62e573712192a9732abc130753d79c1c2"},"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielgerlag%2Fworkflow-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielgerlag%2Fworkflow-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielgerlag%2Fworkflow-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielgerlag%2Fworkflow-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danielgerlag","download_url":"https://codeload.github.com/danielgerlag/workflow-core/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253671755,"owners_count":21945470,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacktoberfest","saga","saga-transactions","workflow","workflow-engine"],"created_at":"2024-07-31T02:01:08.185Z","updated_at":"2025-05-12T03:46:10.534Z","avatar_url":"https://github.com/danielgerlag.png","language":"C#","readme":"# Workflow Core\n\n[![Build status](https://ci.appveyor.com/api/projects/status/xnby6p5v4ur04u76?svg=true)](https://ci.appveyor.com/project/danielgerlag/workflow-core)\n[\u003cimg src=\"https://api.gitsponsors.com/api/badge/img?id=73864802\" height=\"20\"\u003e](https://api.gitsponsors.com/api/badge/link?p=xj6mObb7nZAJGyuABfd8nD5XWf3SE4oUfw0vmCgSiJeIfNlzJAej0FWX8oFdYm6D7bvZpCf6qANVBNPWid4dRQ==)\n\nWorkflow 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.\n\n### Announcements\n\n#### New related project: Conductor\nConductor 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.\n\nhttps://github.com/danielgerlag/conductor\n\n## Documentation\n\nSee [Tutorial here.](https://workflow-core.readthedocs.io)\n\n## Fluent API\n\nDefine your workflows with the fluent API.\n\n```c#\npublic class MyWorkflow : IWorkflow\n{\n    public void Build(IWorkflowBuilder\u003cMyData\u003e builder)\n    {    \n        builder\n           .StartWith\u003cTask1\u003e()\n           .Then\u003cTask2\u003e()\n           .Then\u003cTask3\u003e();\n    }\n}\n```\n\n## JSON / YAML Workflow Definitions\n\nDefine your workflows in JSON or YAML, need to install WorkFlowCore.DSL\n\n```json\n{\n  \"Id\": \"HelloWorld\",\n  \"Version\": 1,\n  \"Steps\": [\n    {\n      \"Id\": \"Hello\",\n      \"StepType\": \"MyApp.HelloWorld, MyApp\",\n      \"NextStepId\": \"Bye\"\n    },        \n    {\n      \"Id\": \"Bye\",\n      \"StepType\": \"MyApp.GoodbyeWorld, MyApp\"\n    }\n  ]\n}\n```\n\n```yaml\nId: HelloWorld\nVersion: 1\nSteps:\n- Id: Hello\n  StepType: MyApp.HelloWorld, MyApp\n  NextStepId: Bye\n- Id: Bye\n  StepType: MyApp.GoodbyeWorld, MyApp\n```\n\n## Sample use cases\n\n* New user workflow\n```c#\npublic class MyData\n{\n\tpublic string Email { get; set; }\n\tpublic string Password { get; set; }\n\tpublic string UserId { get; set; }\n}\n\npublic class MyWorkflow : IWorkflow\n{\n    public void Build(IWorkflowBuilder\u003cMyData\u003e builder)\n    {    \n        builder\n            .StartWith\u003cCreateUser\u003e()\n                .Input(step =\u003e step.Email, data =\u003e data.Email)\n                .Input(step =\u003e step.Password, data =\u003e data.Password)\n                .Output(data =\u003e data.UserId, step =\u003e step.UserId)\n           .Then\u003cSendConfirmationEmail\u003e()\n               .WaitFor(\"confirmation\", data =\u003e data.UserId)\n           .Then\u003cUpdateUser\u003e()\n               .Input(step =\u003e step.UserId, data =\u003e data.UserId);\n    }\n}\n```\n\n* Saga Transactions\n\n```c#\npublic class MyWorkflow : IWorkflow\n{\n    public void Build(IWorkflowBuilder\u003cMyData\u003e builder)\n    {    \n        builder\n            .StartWith\u003cCreateCustomer\u003e()\n            .Then\u003cPushToSalesforce\u003e()\n                .OnError(WorkflowErrorHandling.Retry, TimeSpan.FromMinutes(10))\n            .Then\u003cPushToERP\u003e()\n                .OnError(WorkflowErrorHandling.Retry, TimeSpan.FromMinutes(10));\n    }\n}\n```\n\n```c#\nbuilder\n    .StartWith\u003cLogStart\u003e()\n    .Saga(saga =\u003e saga\n        .StartWith\u003cTask1\u003e()\n            .CompensateWith\u003cUndoTask1\u003e()\n        .Then\u003cTask2\u003e()\n            .CompensateWith\u003cUndoTask2\u003e()\n        .Then\u003cTask3\u003e()\n            .CompensateWith\u003cUndoTask3\u003e()\n    )\n    .OnError(Models.WorkflowErrorHandling.Retry, TimeSpan.FromMinutes(10))\n    .Then\u003cLogEnd\u003e();\n```\n\n## Persistence\n\nSince workflows are typically long running processes, they will need to be persisted to storage between steps.\nThere are several persistence providers available as separate Nuget packages.\n\n* MemoryPersistenceProvider *(Default provider, for demo and testing purposes)*\n* [MongoDB](src/providers/WorkflowCore.Persistence.MongoDB)\n* [Cosmos DB](src/providers/WorkflowCore.Providers.Azure)\n* [Amazon DynamoDB](src/providers/WorkflowCore.Providers.AWS)\n* [SQL Server](src/providers/WorkflowCore.Persistence.SqlServer)\n* [PostgreSQL](src/providers/WorkflowCore.Persistence.PostgreSQL)\n* [Sqlite](src/providers/WorkflowCore.Persistence.Sqlite)\n* [MySQL](src/providers/WorkflowCore.Persistence.MySQL)\n* [Redis](src/providers/WorkflowCore.Providers.Redis)\n\n## Search\n\nA 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.\nThese are also available as separate Nuget packages.\n* [Elasticsearch](src/providers/WorkflowCore.Providers.Elasticsearch)\n\n## Extensions\n\n* [User (human) workflows](src/extensions/WorkflowCore.Users)\n\n\n## Samples\n\n* [Hello World](src/samples/WorkflowCore.Sample01)\n\n* [Multiple outcomes](src/samples/WorkflowCore.Sample12)\n\n* [Passing Data](src/samples/WorkflowCore.Sample03)\n\n* [Parallel ForEach](src/samples/WorkflowCore.Sample09)\n\n* [Sync ForEach](src/samples/WorkflowCore.Sample09s)\n\n* [While Loop](src/samples/WorkflowCore.Sample10)\n\n* [If Statement](src/samples/WorkflowCore.Sample11)\n\n* [Events](src/samples/WorkflowCore.Sample04)\n\n* [Activity Workers](src/samples/WorkflowCore.Sample18)\n\n* [Parallel Tasks](src/samples/WorkflowCore.Sample13)\n\n* [Saga Transactions (with compensation)](src/samples/WorkflowCore.Sample17)\n\n* [Scheduled Background Tasks](src/samples/WorkflowCore.Sample16)\n\n* [Recurring Background Tasks](src/samples/WorkflowCore.Sample14)\n\n* [Dependency Injection](src/samples/WorkflowCore.Sample15)\n\n* [Deferred execution \u0026 re-entrant steps](src/samples/WorkflowCore.Sample05)\n\n* [Looping](src/samples/WorkflowCore.Sample02)\n\n* [Exposing a REST API](src/samples/WebApiSample)\n\n* [Human(User) Workflow](src/samples/WorkflowCore.Sample08)\n\n* [Testing](src/samples/WorkflowCore.TestSample01)\n\n\n## Contributors\n\n* **Daniel Gerlag** - *Initial work*\n* **Jackie Ja**\n* **Aaron Scribner**\n* **Roberto Paterlini**\n\n## Related Projects\n\n* [Conductor](https://github.com/danielgerlag/conductor) (Stand-alone workflow server built on Workflow Core)\n\n## Ports\n\n* [JWorkflow (Java)](https://github.com/danielgerlag/jworkflow)\n* [workflow-es (Node.js)](https://github.com/danielgerlag/workflow-es)\n* [liteflow (Python)](https://github.com/danielgerlag/liteflow)\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details\n\n","funding_links":["https://github.com/sponsors/danielgerlag"],"categories":["Frameworks, Libraries and Tools","C\\#","C# #","hacktoberfest","C#","Libraries, Frameworks and Tools","Workflow","框架, 库和工具","Scheduling","Library (embedded usage)","计划调度","Full fledged product","🗒️ Cheatsheets","Identifiers"],"sub_categories":["Workflow","工作流","GUI - other","📦 Libraries"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielgerlag%2Fworkflow-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielgerlag%2Fworkflow-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielgerlag%2Fworkflow-core/lists"}