{"id":67,"date":"2026-07-25T09:01:24","date_gmt":"2026-07-25T09:01:24","guid":{"rendered":"https:\/\/biziq.info\/?p=67"},"modified":"2026-07-25T09:01:24","modified_gmt":"2026-07-25T09:01:24","slug":"from-zero-to-hero-with-elsa-workflow","status":"publish","type":"post","link":"https:\/\/biziq.info\/index.php\/2026\/07\/25\/from-zero-to-hero-with-elsa-workflow\/","title":{"rendered":"From Zero to Hero with ELSA Workflow"},"content":{"rendered":"<h1><span class=\"\">From Zero to Hero with ELSA Workflow: A Complete .NET Workflow Development Guide<\/span><\/h1>\n<h2><span class=\"\">Preface: What Is Workflow Development?<\/span><\/h2>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Before we dive in, let\u2019s clarify a fundamental question: <\/span><strong><span class=\"\">what exactly is workflow development?<\/span><\/strong><\/p>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Imagine you are processing an order approval flow:<\/span><br \/>\n<em><span class=\"\">Customer places order \u2192 Inventory check \u2192 Manager approval \u2192 Shipping notification<\/span><\/em><span class=\"\">.<\/span><br \/>\n<span class=\"\">This process involves multiple steps, may require different people and systems, and has a clear order and conditional branches. In software development, we call such a <\/span><strong><span class=\"\">sequence of steps (called &#8220;activities&#8221;) that represents a business process<\/span><\/strong><span class=\"\"> a <\/span><strong><span class=\"\">workflow<\/span><\/strong><span class=\"\">.<\/span><\/p>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">The core idea of workflow development is <\/span><strong><span class=\"\">separating business logic from application code<\/span><\/strong><span class=\"\">. Instead of hard\u2011coding each step, you define the process in a more intuitive way \u2013 visually or declaratively. The benefits are huge:<\/span><\/p>\n<ul>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Business people can understand and modify the process directly.<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">When the process changes, you don\u2019t need to recompile and redeploy the whole application.<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Complex flows become manageable and auditable.<\/span><\/p>\n<\/li>\n<\/ul>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">ELSA Workflow<\/span><\/strong><span class=\"\"> is one of the best\u2011in\u2011class open\u2011source workflow engines for the .NET ecosystem \u2013 free (MIT License), feature\u2011rich, and production\u2011ready.<\/span><\/p>\n<hr \/>\n<h2><span class=\"\">Part 1: What Is ELSA Workflow?<\/span><\/h2>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">ELSA Workflow is a set of .NET libraries that lets you add workflow capabilities to your .NET applications. Think of it as <\/span><strong><span class=\"\">Lego bricks for building your own workflow engine<\/span><\/strong><span class=\"\">.<\/span><\/p>\n<h3><span class=\"\">Key Features at a Glance<\/span><\/h3>\n<div class=\"ds-scroll-area ds-scroll-area--show-on-focus-within ds-scroll-area--enabled _1210dd7 c03cafe9\">\n<div class=\"ds-scroll-area__gutters\">\n<div class=\"ds-scroll-area__horizontal-gutter\"><\/div>\n<div class=\"ds-scroll-area__vertical-gutter\"><\/div>\n<\/div>\n<table>\n<thead>\n<tr>\n<th><span class=\"\">Feature<\/span><\/th>\n<th><span class=\"\">Description<\/span><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong><span class=\"\">Multiple definition styles<\/span><\/strong><\/td>\n<td><span class=\"\">Define workflows in C#, JSON, or with a visual designer.<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span class=\"\">Short\u2011 and long\u2011running<\/span><\/strong><\/td>\n<td><span class=\"\">Supports workflows that finish in milliseconds or span days\/years.<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span class=\"\">Rich activity library<\/span><\/strong><\/td>\n<td><span class=\"\">Many built\u2011in activities ready to use.<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span class=\"\">Trigger mechanism<\/span><\/strong><\/td>\n<td><span class=\"\">Start workflows based on events or conditions.<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span class=\"\">Dynamic expressions<\/span><\/strong><\/td>\n<td><span class=\"\">Use C#, JavaScript, or Liquid expressions.<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span class=\"\">Persistence agnostic<\/span><\/strong><\/td>\n<td><span class=\"\">Works with EF Core, MongoDB, Dapper, and more.<\/span><\/td>\n<\/tr>\n<tr>\n<td><strong><span class=\"\">Visual designer<\/span><\/strong><\/td>\n<td><span class=\"\">Drag\u2011and\u2011drop web\u2011based designer (ELSA Studio).<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<hr \/>\n<h2><span class=\"\">Part 2: Core Concepts \u2013 Quick Overview<\/span><\/h2>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Learn these key terms before you start coding:<\/span><\/p>\n<h3><span class=\"\">\ud83e\udde9 Activity<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">The <\/span><strong><span class=\"\">smallest executable unit<\/span><\/strong><span class=\"\"> \u2013 each activity represents one concrete action, e.g., <\/span><code>WriteLine<\/code><span class=\"\"> prints text, <\/span><code>Delay<\/code><span class=\"\"> waits for a time.<\/span><\/p>\n<h3><span class=\"\">\ud83d\udccb Workflow<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">A <\/span><strong><span class=\"\">sequence of activities<\/span><\/strong><span class=\"\"> that defines a complete business process. In ELSA, workflows are represented by the <\/span><code>Workflow<\/code><span class=\"\"> class.<\/span><\/p>\n<h3><span class=\"\">\ud83d\udd16 Bookmark<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">A <\/span><strong><span class=\"\">pause point<\/span><\/strong><span class=\"\"> in the workflow. When an activity needs to wait for an external event (e.g., user approval, HTTP callback), it creates a bookmark and suspends execution until resumed.<\/span><\/p>\n<h3><span class=\"\">\ud83d\ude80 Trigger<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">A special activity that <\/span><strong><span class=\"\">starts<\/span><\/strong><span class=\"\"> new workflow instances. For example, <\/span><code>HttpEndpoint<\/code><span class=\"\"> starts a workflow when it receives an HTTP request.<\/span><\/p>\n<h3><span class=\"\">\ud83d\udd17 Connection<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Defines the <\/span><strong><span class=\"\">transition<\/span><\/strong><span class=\"\"> between activities \u2013 after one completes, which one runs next.<\/span><\/p>\n<h3><span class=\"\">\ud83d\udcca Variable<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Used to <\/span><strong><span class=\"\">store and pass data<\/span><\/strong><span class=\"\"> during workflow execution.<\/span><\/p>\n<hr \/>\n<h2><span class=\"\">Part 3: Setting Up Your Environment<\/span><\/h2>\n<h3><span class=\"\">3.1 Quickest Way \u2013 Use Docker<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">ELSA provides a ready\u2011to\u2011run Docker image that includes both the ELSA Server and the ELSA Studio designer:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">bash<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token function\">docker<\/span> pull elsaworkflows\/elsa-server-and-studio-v3:latest\r\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-t<\/span> <span class=\"token parameter variable\">-i<\/span> <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">ASPNETCORE_ENVIRONMENT<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">'Development'<\/span> <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">HTTP_PORTS<\/span><span class=\"token operator\">=<\/span><span class=\"token number\">8080<\/span> <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">HTTP__BASEURL<\/span><span class=\"token operator\">=<\/span>http:\/\/localhost:13000 <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">13000<\/span>:8080 elsaworkflows\/elsa-server-and-studio-v3:latest<\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">After startup, open <\/span><code>http:\/\/localhost:13000<\/code><span class=\"\"> and log in with <\/span><code>admin<\/code><span class=\"\"> \/ <\/span><code>password<\/code><span class=\"\">.<\/span><\/p>\n<blockquote>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">\u26a0\ufe0f <\/span><strong><span class=\"\">Note<\/span><\/strong><span class=\"\">: This image is for development and evaluation only \u2013 <\/span><strong><span class=\"\">do not use in production<\/span><\/strong><span class=\"\">.<\/span><\/p>\n<\/blockquote>\n<h3><span class=\"\">3.2 Integrate into an Existing .NET Project<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">If you prefer to embed ELSA in your own <\/span><a href=\"https:\/\/ASP.NET\" target=\"_blank\" rel=\"noopener noreferrer\"><span class=\"\">ASP.NET<\/span><\/a><span class=\"\"> Core application, follow these steps:<\/span><\/p>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">Step 1: Install NuGet packages<\/span><\/strong><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">bash<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre>dotnet <span class=\"token function\">add<\/span> package Elsa<\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Additional packages you may need:<\/span><\/p>\n<ul>\n<li>\n<p class=\"ds-markdown-paragraph\"><code>Elsa.EntityFrameworkCore<\/code><span class=\"\"> \u2013 for EF Core persistence<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><code>Elsa.MongoDb<\/code><span class=\"\"> \u2013 for MongoDB persistence<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><code>Elsa.Http<\/code><span class=\"\"> \u2013 HTTP activities<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><code>Elsa.Studio<\/code><span class=\"\"> \u2013 for the visual designer (if you host it)<\/span><\/p>\n<\/li>\n<\/ul>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">Step 2: Configure services<\/span><\/strong><\/p>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">In your <\/span><code>Program.cs<\/code><span class=\"\">:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre>builder<span class=\"token punctuation\">.<\/span>Services<span class=\"token punctuation\">.<\/span><span class=\"token function\">AddElsa<\/span><span class=\"token punctuation\">(<\/span>options <span class=\"token operator\">=&gt;<\/span> options\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">UseEntityFrameworkPersistence<\/span><span class=\"token punctuation\">(<\/span>ef <span class=\"token operator\">=&gt;<\/span> ef<span class=\"token punctuation\">.<\/span><span class=\"token function\">UseSqlite<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Data Source=elsa.db\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">AddConsoleActivities<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">AddHttpActivities<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">AddWorkflowsFrom<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>Program<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\napp<span class=\"token punctuation\">.<\/span><span class=\"token function\">UseWorkflowsApi<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\napp<span class=\"token punctuation\">.<\/span><span class=\"token function\">UseWorkflows<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/pre>\n<\/div>\n<hr \/>\n<h2><span class=\"\">Part 4: Your First Workflow (Basic)<\/span><\/h2>\n<h3><span class=\"\">Example 1: Hello World (Pure Code)<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">The simplest possible workflow \u2013 prints a greeting:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">using<\/span> <span class=\"token namespace\">Elsa<span class=\"token punctuation\">.<\/span>Workflows<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">using<\/span> <span class=\"token namespace\">Elsa<span class=\"token punctuation\">.<\/span>Workflows<span class=\"token punctuation\">.<\/span>Activities<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">HelloWorldWorkflow<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">IWorkflow<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowBuilder<\/span> builder<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        builder\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">StartWith<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Hello World from ELSA!\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Welcome to workflow development!\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">This workflow has two sequential steps \u2013 both print messages.<\/span><\/p>\n<h3><span class=\"\">Example 2: Using Sequence<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">You can also use the <\/span><code>Sequence<\/code><span class=\"\"> activity for a more declarative style:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">using<\/span> <span class=\"token namespace\">Elsa<span class=\"token punctuation\">.<\/span>Workflows<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">using<\/span> <span class=\"token namespace\">Elsa<span class=\"token punctuation\">.<\/span>Workflows<span class=\"token punctuation\">.<\/span>Activities<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> workflow <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Sequence<\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    Activities <span class=\"token operator\">=<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">WriteLine<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Hello World!\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Delay<\/span><span class=\"token punctuation\">(<\/span>TimeSpan<span class=\"token punctuation\">.<\/span><span class=\"token function\">FromSeconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n        <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">WriteLine<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"It is nice to meet you!\"<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/pre>\n<\/div>\n<h3><span class=\"\">Example 3: Using an HTTP Trigger (Visual Designer)<\/span><\/h3>\n<ol start=\"1\">\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Open ELSA Studio at <\/span><code>http:\/\/localhost:13000<\/code><span class=\"\">.<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Go to <\/span><strong><span class=\"\">Workflows \u2192 Definitions<\/span><\/strong><span class=\"\"> and click <\/span><strong><span class=\"\">CREATE WORKFLOW<\/span><\/strong><span class=\"\">.<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Drag an <\/span><strong><span class=\"\">HTTP Endpoint<\/span><\/strong><span class=\"\"> activity onto the canvas \u2013 this will be the trigger.<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Configure its <\/span><strong><span class=\"\">Path<\/span><\/strong><span class=\"\"> (e.g., <\/span><code>\/hello<\/code><span class=\"\">) and <\/span><strong><span class=\"\">Method<\/span><\/strong><span class=\"\"> (e.g., <\/span><code>GET<\/code><span class=\"\">).<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Connect a <\/span><strong><span class=\"\">WriteLine<\/span><\/strong><span class=\"\"> activity after it and set its Text to <\/span><code>\"Hello from HTTP!\"<\/code><span class=\"\">.<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Connect a <\/span><strong><span class=\"\">HTTP Response<\/span><\/strong><span class=\"\"> activity after the WriteLine.<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Click the green <\/span><strong><span class=\"\">Run<\/span><\/strong><span class=\"\"> button to test.<\/span><\/p>\n<\/li>\n<\/ol>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">After publishing, visit <\/span><code>http:\/\/localhost:13000\/api\/workflows\/hello<\/code><span class=\"\"> to trigger the workflow.<\/span><\/p>\n<hr \/>\n<h2><span class=\"\">Part 5: Intermediate \u2013 Variables and Data Passing<\/span><\/h2>\n<h3><span class=\"\">Example 4: Using Workflow Variables<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Variables allow you to store and share data across activities:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">VariableDemoWorkflow<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">IWorkflow<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowBuilder<\/span> builder<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> nameVariable <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Variable<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        \r\n        builder\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">StartWith<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>SetVariable<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">&gt;<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n            <span class=\"token punctuation\">{<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Variable <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span>nameVariable<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Value <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Alice\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token interpolation-string\"><span class=\"token string\">$\"Hello, <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token expression language-csharp\">nameVariable<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">!\"<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>SetVariable<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">&gt;<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n            <span class=\"token punctuation\">{<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Variable <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span>nameVariable<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Value <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Bob\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token interpolation-string\"><span class=\"token string\">$\"Goodbye, <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token expression language-csharp\">nameVariable<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">!\"<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<h3><span class=\"\">Example 5: Using Activity Outputs<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Activities can produce output that subsequent activities consume:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">OutputDemoWorkflow<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">IWorkflow<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowBuilder<\/span> builder<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> resultVariable <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Variable<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        \r\n        builder\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">StartWith<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>CalculateActivity<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n            <span class=\"token punctuation\">{<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Result <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span>resultVariable<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token interpolation-string\"><span class=\"token string\">$\"The result is: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token expression language-csharp\">resultVariable<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\"<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<hr \/>\n<h2><span class=\"\">Part 6: Intermediate \u2013 Conditional Branching<\/span><\/h2>\n<h3><span class=\"\">Example 6: Using the Decision Activity<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><code>Decision<\/code><span class=\"\"> works like an <\/span><code>if<\/code><span class=\"\"> statement \u2013 it chooses a branch based on a condition:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">DecisionWorkflow<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">IWorkflow<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowBuilder<\/span> builder<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> scoreVariable <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Variable<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        \r\n        builder\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">StartWith<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>SetVariable<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">&gt;<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n            <span class=\"token punctuation\">{<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Variable <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span>scoreVariable<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Value <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">85<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>Decision<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n            <span class=\"token punctuation\">{<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Condition <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token interpolation-string\"><span class=\"token string\">$\"return <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token expression language-csharp\">scoreVariable<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> &gt;= 60;\"<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">When<\/span><span class=\"token punctuation\">(<\/span>Outcome<span class=\"token punctuation\">.<\/span>True<span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Congratulations, you passed!\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">When<\/span><span class=\"token punctuation\">(<\/span>Outcome<span class=\"token punctuation\">.<\/span>False<span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Sorry, you failed.\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<h3><span class=\"\">Example 7: Using the Switch Activity<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><code>Switch<\/code><span class=\"\"> works like a <\/span><code>switch<\/code><span class=\"\"> statement, supporting multiple cases:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">SwitchWorkflow<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">IWorkflow<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowBuilder<\/span> builder<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> roleVariable <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Variable<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        \r\n        builder\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">StartWith<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>SetVariable<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">&gt;<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n            <span class=\"token punctuation\">{<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Variable <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span>roleVariable<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Value <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"admin\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>Switch<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n            <span class=\"token punctuation\">{<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Value <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span>roleVariable<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Cases<span class=\"token punctuation\">.<\/span><span class=\"token function\">Add<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"admin\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">SwitchCase<\/span> <span class=\"token punctuation\">{<\/span> Label <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Admin\"<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Cases<span class=\"token punctuation\">.<\/span><span class=\"token function\">Add<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"user\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">SwitchCase<\/span> <span class=\"token punctuation\">{<\/span> Label <span class=\"token operator\">=<\/span> <span class=\"token string\">\"User\"<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Cases<span class=\"token punctuation\">.<\/span><span class=\"token function\">Add<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"guest\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">SwitchCase<\/span> <span class=\"token punctuation\">{<\/span> Label <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Guest\"<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">When<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Admin\"<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Welcome Admin! Full access.\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">When<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"User\"<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Welcome User! Limited access.\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">When<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Guest\"<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Welcome Guest! Read\u2011only access.\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<hr \/>\n<h2><span class=\"\">Part 7: Intermediate \u2013 Parallel Execution<\/span><\/h2>\n<h3><span class=\"\">Example 8: Using Fork and Join<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><code>Fork<\/code><span class=\"\"> splits the workflow into parallel branches, and <\/span><code>Join<\/code><span class=\"\"> waits for all to complete:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">ForkJoinWorkflow<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">IWorkflow<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowBuilder<\/span> builder<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        builder\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">StartWith<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>Fork<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n            <span class=\"token punctuation\">{<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Branches <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token string\">\"Branch1\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"Branch2\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"Branch3\"<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">When<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Branch1\"<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Branch 1 started...\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>Delay<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Duration <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span>TimeSpan<span class=\"token punctuation\">.<\/span><span class=\"token function\">FromSeconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Branch 1 done!\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">When<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Branch2\"<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Branch 2 started...\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>Delay<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Duration <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span>TimeSpan<span class=\"token punctuation\">.<\/span><span class=\"token function\">FromSeconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Branch 2 done!\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">When<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Branch3\"<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Branch 3 started...\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Branch 3 done!\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">Join<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"All branches completed!\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<hr \/>\n<h2><span class=\"\">Part 8: Advanced \u2013 Long\u2011Running Workflows and Bookmarks<\/span><\/h2>\n<h3><span class=\"\">Example 9: Waiting for an Event<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Long\u2011running workflows pause and wait for external events:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">ApprovalWorkflow<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">IWorkflow<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowBuilder<\/span> builder<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> approvalVariable <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Variable<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">bool<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        \r\n        builder\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">StartWith<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Waiting for approval...\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>Event<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>EventName <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Approval\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>ReadEvent<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n            <span class=\"token punctuation\">{<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>EventName <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Approval\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Output <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span>approvalVariable<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>Decision<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Condition <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token interpolation-string\"><span class=\"token string\">$\"return <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token expression language-csharp\">approvalVariable<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> == true;\"<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">When<\/span><span class=\"token punctuation\">(<\/span>Outcome<span class=\"token punctuation\">.<\/span>True<span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\u2705 Approved!\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token function\">When<\/span><span class=\"token punctuation\">(<\/span>Outcome<span class=\"token punctuation\">.<\/span>False<span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\u274c Rejected!\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">How to trigger the event from the outside:<\/span><\/strong><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">await<\/span> eventPublisher<span class=\"token punctuation\">.<\/span><span class=\"token function\">PublishAsync<\/span><span class=\"token punctuation\">(<\/span>\r\n    <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">WorkflowEvent<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Approval\"<\/span><span class=\"token punctuation\">,<\/span> workflowInstanceId<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        Input <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Dictionary<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">object<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n        <span class=\"token punctuation\">{<\/span>\r\n            <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"ApprovalResult\"<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token boolean\">true<\/span>   <span class=\"token comment\">\/\/ or false<\/span>\r\n        <span class=\"token punctuation\">}<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/pre>\n<\/div>\n<hr \/>\n<h2><span class=\"\">Part 9: Advanced \u2013 Child Workflows<\/span><\/h2>\n<h3><span class=\"\">Example 10: Dispatching a Sub\u2011Workflow<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Use <\/span><code>DispatchWorkflow<\/code><span class=\"\"> to start another workflow from within a parent:<\/span><\/p>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">Child workflow:<\/span><\/strong><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">ChildWorkflow<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">IWorkflow<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowBuilder<\/span> builder<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> inputVariable <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Variable<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        \r\n        builder\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">StartWith<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token interpolation-string\"><span class=\"token string\">$\"Child received: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token expression language-csharp\">inputVariable<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\"<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Child finished.\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">Parent workflow:<\/span><\/strong><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">ParentWorkflow<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">IWorkflow<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowBuilder<\/span> builder<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        builder\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">StartWith<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Parent started...\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>DispatchWorkflow<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n            <span class=\"token punctuation\">{<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>WorkflowDefinitionId <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"ChildWorkflow\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Input <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Dictionary<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">string<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">object<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\r\n                <span class=\"token punctuation\">{<\/span>\r\n                    <span class=\"token punctuation\">[<\/span><span class=\"token string\">\"Input\"<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Data from parent\"<\/span>\r\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span> x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Child dispatched. Parent continues.\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<blockquote>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">\ud83d\udca1 <\/span><strong><span class=\"\">Tip<\/span><\/strong><span class=\"\">: <\/span><code>DispatchWorkflow<\/code><span class=\"\"> is &#8220;fire\u2011and\u2011forget&#8221;. If you need to wait for the child to finish, use <\/span><code>RunWorkflow<\/code><span class=\"\"> instead.<\/span><\/p>\n<\/blockquote>\n<hr \/>\n<h2><span class=\"\">Part 10: Advanced \u2013 Custom Activities<\/span><\/h2>\n<h3><span class=\"\">Example 11: Building Your Own Activity<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">ELSA is highly extensible \u2013 you can create custom activities easily:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">using<\/span> <span class=\"token namespace\">Elsa<span class=\"token punctuation\">.<\/span>Workflows<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">using<\/span> <span class=\"token namespace\">Elsa<span class=\"token punctuation\">.<\/span>Workflows<span class=\"token punctuation\">.<\/span>Attributes<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">using<\/span> <span class=\"token namespace\">Elsa<span class=\"token punctuation\">.<\/span>Workflows<span class=\"token punctuation\">.<\/span>Models<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">Activity<\/span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Custom\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"Math\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"A simple addition calculator\"<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><span class=\"token punctuation\">]<\/span>\r\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">AddActivity<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">Activity<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">Input<\/span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(<\/span>Description <span class=\"token operator\">=<\/span> <span class=\"token string\">\"First number\"<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><span class=\"token punctuation\">]<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\">Input<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> Number1 <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">get<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">set<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n    <span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">Input<\/span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(<\/span>Description <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Second number\"<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><span class=\"token punctuation\">]<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\">Input<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> Number2 <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">get<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">set<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n    <span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">Output<\/span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(<\/span>Description <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Sum of the two numbers\"<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><span class=\"token punctuation\">]<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\">Output<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> Result <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">get<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">set<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span> <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n    <span class=\"token keyword\">protected<\/span> <span class=\"token keyword\">override<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token return-type class-name\">ValueTask<\/span> <span class=\"token function\">ExecuteAsync<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">ActivityExecutionContext<\/span> context<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> num1 <span class=\"token operator\">=<\/span> Number1<span class=\"token punctuation\">.<\/span><span class=\"token function\">Get<\/span><span class=\"token punctuation\">(<\/span>context<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> num2 <span class=\"token operator\">=<\/span> Number2<span class=\"token punctuation\">.<\/span><span class=\"token function\">Get<\/span><span class=\"token punctuation\">(<\/span>context<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> sum <span class=\"token operator\">=<\/span> num1 <span class=\"token operator\">+<\/span> num2<span class=\"token punctuation\">;<\/span>\r\n        \r\n        context<span class=\"token punctuation\">.<\/span><span class=\"token function\">Set<\/span><span class=\"token punctuation\">(<\/span>Result<span class=\"token punctuation\">,<\/span> sum<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        context<span class=\"token punctuation\">.<\/span><span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token interpolation-string\"><span class=\"token string\">$\"Calculated: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token expression language-csharp\">num1<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> + <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token expression language-csharp\">num2<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> = <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token expression language-csharp\">sum<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\"<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        \r\n        <span class=\"token keyword\">await<\/span> Task<span class=\"token punctuation\">.<\/span>CompletedTask<span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">Register the custom activity:<\/span><\/strong><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre>builder<span class=\"token punctuation\">.<\/span>Services<span class=\"token punctuation\">.<\/span><span class=\"token function\">AddElsa<\/span><span class=\"token punctuation\">(<\/span>options <span class=\"token operator\">=&gt;<\/span> options\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">AddActivity<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>AddActivity<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token comment\">\/\/ ... other configurations<\/span>\r\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">Use it in a workflow:<\/span><\/strong><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">CustomActivityWorkflow<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">IWorkflow<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void<\/span><\/span> <span class=\"token function\">Build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowBuilder<\/span> builder<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> resultVariable <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token constructor-invocation class-name\">Variable<span class=\"token punctuation\">&lt;<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        \r\n        builder\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">StartWith<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>AddActivity<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n            <span class=\"token punctuation\">{<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Number1 <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Number2 <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">20<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Result <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span>resultVariable<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span>\r\n            <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">Then<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>WriteLine<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">=&gt;<\/span>\r\n                x<span class=\"token punctuation\">.<\/span>Text <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span><span class=\"token interpolation-string\"><span class=\"token string\">$\"10 + 20 = <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token expression language-csharp\">resultVariable<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\"<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<hr \/>\n<h2><span class=\"\">Part 11: Advanced \u2013 Persistence Configuration<\/span><\/h2>\n<h3><span class=\"\">Example 12: EF Core Persistence<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">To survive application restarts, you need to persist workflow state:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token comment\">\/\/ Install: dotnet add package Elsa.EntityFrameworkCore<\/span>\r\n<span class=\"token comment\">\/\/ Install: dotnet add package Microsoft.EntityFrameworkCore.Sqlite<\/span>\r\n\r\nbuilder<span class=\"token punctuation\">.<\/span>Services<span class=\"token punctuation\">.<\/span><span class=\"token function\">AddElsa<\/span><span class=\"token punctuation\">(<\/span>options <span class=\"token operator\">=&gt;<\/span> options\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">UseEntityFrameworkPersistence<\/span><span class=\"token punctuation\">(<\/span>ef <span class=\"token operator\">=&gt;<\/span> ef\r\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">UseSqlite<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Data Source=elsa.db\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">AddConsoleActivities<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">AddHttpActivities<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">AddWorkflowsFrom<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>Program<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/pre>\n<\/div>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">Run migrations:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">bash<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre>dotnet ef migrations <span class=\"token function\">add<\/span> InitialCreate\r\ndotnet ef database update<\/pre>\n<\/div>\n<h3><span class=\"\">Example 13: MongoDB Persistence<\/span><\/h3>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token comment\">\/\/ dotnet add package Elsa.Persistence.MongoDb<\/span>\r\n\r\nbuilder<span class=\"token punctuation\">.<\/span>Services<span class=\"token punctuation\">.<\/span><span class=\"token function\">AddElsa<\/span><span class=\"token punctuation\">(<\/span>options <span class=\"token operator\">=&gt;<\/span> options\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">UseMongoDbPersistence<\/span><span class=\"token punctuation\">(<\/span>mongo <span class=\"token operator\">=&gt;<\/span> mongo\r\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">WithConnectionString<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"mongodb:\/\/localhost:27017\"<\/span><span class=\"token punctuation\">)<\/span>\r\n        <span class=\"token punctuation\">.<\/span><span class=\"token function\">WithDatabaseName<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"ElsaWorkflows\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token function\">AddConsoleActivities<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">.<\/span><span class=\"token generic-method\"><span class=\"token function\">AddWorkflowsFrom<\/span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;<\/span>Program<span class=\"token punctuation\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/pre>\n<\/div>\n<hr \/>\n<h2><span class=\"\">Part 12: Execution and Dispatching<\/span><\/h2>\n<h3><span class=\"\">Example 14: Synchronous Execution<\/span><\/h3>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">ApiController<\/span><\/span><span class=\"token punctuation\">]<\/span>\r\n<span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">Route<\/span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"api\/workflows\"<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><span class=\"token punctuation\">]<\/span>\r\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">WorkflowController<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">ControllerBase<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">readonly<\/span> <span class=\"token class-name\">IWorkflowRunner<\/span> _workflowRunner<span class=\"token punctuation\">;<\/span>\r\n\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token function\">WorkflowController<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowRunner<\/span> workflowRunner<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        _workflowRunner <span class=\"token operator\">=<\/span> workflowRunner<span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n\r\n    <span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">HttpPost<\/span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"run\"<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><span class=\"token punctuation\">]<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token return-type class-name\">Task<span class=\"token punctuation\">&lt;<\/span>IActionResult<span class=\"token punctuation\">&gt;<\/span><\/span> <span class=\"token function\">RunWorkflow<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">FromBody<\/span><\/span><span class=\"token punctuation\">]<\/span> <span class=\"token class-name\">RunWorkflowRequest<\/span> request<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token class-name\"><span class=\"token keyword\">var<\/span><\/span> result <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> _workflowRunner<span class=\"token punctuation\">.<\/span><span class=\"token function\">RunAsync<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">Ok<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<h3><span class=\"\">Example 15: Asynchronous Dispatch<\/span><\/h3>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">For production, use the dispatcher to queue executions:<\/span><\/p>\n<div class=\"md-code-block md-code-block-light\">\n<div class=\"md-code-block-banner-wrap\">\n<div class=\"md-code-block-banner md-code-block-banner-lite\">\n<div class=\"_121d384\">\n<div class=\"d2a24f03\"><span class=\"d813de27\">csharp<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">ApiController<\/span><\/span><span class=\"token punctuation\">]<\/span>\r\n<span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">Route<\/span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"api\/workflows\"<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><span class=\"token punctuation\">]<\/span>\r\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">WorkflowController<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token type-list\"><span class=\"token class-name\">ControllerBase<\/span><\/span>\r\n<span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">readonly<\/span> <span class=\"token class-name\">IWorkflowDispatcher<\/span> _workflowDispatcher<span class=\"token punctuation\">;<\/span>\r\n\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token function\">WorkflowController<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">IWorkflowDispatcher<\/span> workflowDispatcher<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        _workflowDispatcher <span class=\"token operator\">=<\/span> workflowDispatcher<span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n\r\n    <span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">HttpPost<\/span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"dispatch\"<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><span class=\"token punctuation\">]<\/span>\r\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token return-type class-name\">Task<span class=\"token punctuation\">&lt;<\/span>IActionResult<span class=\"token punctuation\">&gt;<\/span><\/span> <span class=\"token function\">DispatchWorkflow<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token attribute\"><span class=\"token class-name\">FromBody<\/span><\/span><span class=\"token punctuation\">]<\/span> <span class=\"token class-name\">DispatchWorkflowDefinitionRequest<\/span> request<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token punctuation\">{<\/span>\r\n        <span class=\"token keyword\">await<\/span> _workflowDispatcher<span class=\"token punctuation\">.<\/span><span class=\"token function\">DispatchAsync<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">Accepted<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Workflow queued for execution\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/pre>\n<\/div>\n<blockquote>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">\ud83d\udca1 <\/span><strong><span class=\"\">Key difference<\/span><\/strong><span class=\"\">: <\/span><code>IWorkflowRunner<\/code><span class=\"\"> runs synchronously (good for testing). <\/span><code>IWorkflowDispatcher<\/code><span class=\"\"> runs asynchronously via a queue \u2013 <\/span><strong><span class=\"\">preferred for production<\/span><\/strong><span class=\"\">.<\/span><\/p>\n<\/blockquote>\n<hr \/>\n<h2><span class=\"\">Summary and Resources<\/span><\/h2>\n<h3><span class=\"\">Suggested Learning Path<\/span><\/h3>\n<div class=\"ds-scroll-area ds-scroll-area--show-on-focus-within ds-scroll-area--enabled _1210dd7 c03cafe9\">\n<div class=\"ds-scroll-area__gutters\">\n<div class=\"ds-scroll-area__horizontal-gutter\"><\/div>\n<div class=\"ds-scroll-area__vertical-gutter\"><\/div>\n<\/div>\n<table>\n<thead>\n<tr>\n<th><span class=\"\">Phase<\/span><\/th>\n<th><span class=\"\">Topics<\/span><\/th>\n<th><span class=\"\">Time<\/span><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><span class=\"\">Beginner<\/span><\/td>\n<td><span class=\"\">Hello World, Sequence, WriteLine<\/span><\/td>\n<td><span class=\"\">1\u20112 days<\/span><\/td>\n<\/tr>\n<tr>\n<td><span class=\"\">Intermediate<\/span><\/td>\n<td><span class=\"\">Variables, data passing, HTTP triggers<\/span><\/td>\n<td><span class=\"\">3\u20115 days<\/span><\/td>\n<\/tr>\n<tr>\n<td><span class=\"\">Advanced<\/span><\/td>\n<td><span class=\"\">Conditionals, parallel execution, long\u2011running<\/span><\/td>\n<td><span class=\"\">1\u20112 weeks<\/span><\/td>\n<\/tr>\n<tr>\n<td><span class=\"\">Expert<\/span><\/td>\n<td><span class=\"\">Custom activities, child workflows, persistence<\/span><\/td>\n<td><span class=\"\">2\u20114 weeks<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h3><span class=\"\">Recommended Resources<\/span><\/h3>\n<ul>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">\ud83d\udcd6 <\/span><strong><span class=\"\">Official Docs<\/span><\/strong><span class=\"\">: <\/span><a href=\"https:\/\/docs.elsaworkflows.io\" target=\"_blank\" rel=\"noopener noreferrer\"><span class=\"\">docs.elsaworkflows.io<\/span><\/a><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">\ud83d\udc19 <\/span><strong><span class=\"\">GitHub<\/span><\/strong><span class=\"\">: <\/span><a href=\"https:\/\/github.com\/elsa-workflows\/elsa-core\" target=\"_blank\" rel=\"noopener noreferrer\"><span class=\"\">github.com\/elsa-workflows\/elsa-core<\/span><\/a><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">\ud83c\udfa8 <\/span><strong><span class=\"\">ELSA Studio<\/span><\/strong><span class=\"\">: Visual designer for drag\u2011and\u2011drop workflow design<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><span class=\"\">\ud83d\udc33 <\/span><strong><span class=\"\">Docker Image<\/span><\/strong><span class=\"\">: Quick start with ELSA Server + Studio<\/span><\/p>\n<\/li>\n<\/ul>\n<h3><span class=\"\">Best Practices Reminder<\/span><\/h3>\n<ol start=\"1\">\n<li>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">Always configure persistence in production<\/span><\/strong><span class=\"\"> \u2013 otherwise state is lost on restart.<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">Long\u2011running workflows must use persistence and dispatching<\/span><\/strong><span class=\"\"> \u2013 otherwise timers and resumptions won&#8217;t work.<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">Prefer asynchronous dispatch over synchronous run<\/span><\/strong><span class=\"\"> for better throughput.<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">Use variables wisely<\/span><\/strong><span class=\"\"> \u2013 distinguish workflow\u2011level from transient variables.<\/span><\/p>\n<\/li>\n<li>\n<p class=\"ds-markdown-paragraph\"><strong><span class=\"\">Leverage ELSA Studio<\/span><\/strong><span class=\"\"> \u2013 let non\u2011developers also participate in process design.<\/span><\/p>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>From Zero to Hero with ELSA Workflow: A Complete .NET Workflow Development Guide Preface: What Is Workflow Development? Before we dive in, let\u2019s clarify a fundamental question: what exactly is&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48,49],"tags":[52,50,51],"class_list":["post-67","post","type-post","status-publish","format-standard","hentry","category-programming","category-workflow","tag-net","tag-elsa","tag-workflow"],"_links":{"self":[{"href":"https:\/\/biziq.info\/index.php\/wp-json\/wp\/v2\/posts\/67","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/biziq.info\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/biziq.info\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/biziq.info\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/biziq.info\/index.php\/wp-json\/wp\/v2\/comments?post=67"}],"version-history":[{"count":1,"href":"https:\/\/biziq.info\/index.php\/wp-json\/wp\/v2\/posts\/67\/revisions"}],"predecessor-version":[{"id":68,"href":"https:\/\/biziq.info\/index.php\/wp-json\/wp\/v2\/posts\/67\/revisions\/68"}],"wp:attachment":[{"href":"https:\/\/biziq.info\/index.php\/wp-json\/wp\/v2\/media?parent=67"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/biziq.info\/index.php\/wp-json\/wp\/v2\/categories?post=67"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/biziq.info\/index.php\/wp-json\/wp\/v2\/tags?post=67"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}