☰
practical-aspnetcore 实战:在 Elsa Workflow 中用 If 活动实现条件分支(Condition / Then / Else)
2026/10/15 17:19:33 网站建设 项目流程
  • 示例工程

【免费下载链接】practical-aspnetcore

Practical samples of ASP.NET Core 11, 10, 9, 8.0, 7.0, 6.0, 5.0, 3.1, 2.2, and 2.1,projects you can use. Readme contains explanations on all projects.

项目地址:https://gitcode.com/gh_mirrors/pr/practical-aspnetcore
点击查看免费下载

导读

本文基于practical-aspnetcore仓库中的 Elsa Workflow 示例(projects/elsa/if-activity),系统讲解如何用 Elsa 3.x 的If容器活动实现基于条件的流程分支,以及如何借助Variable变量在流程中传递与读取数据。读完本文,你将掌握If活动的Condition、Then、Else三个核心属性的用法,看懂示例源码中变量声明、条件表达式与分支活动的完整写法,并了解该示例在 Elsa 控制流活动家族中的位置。

一、示例概览:条件分支如何进入工作流

Elsa 是面向 .NET Core 的工作流引擎库,被收录进该仓库的原因是作者认为工作流引擎在 ASP.NET Core 应用未来发展中扮演重要角色(见 projects/elsa/README.md)。仓库中的 if-activity 示例 演示了 Elsa 最基础的控制流能力——条件判断:

If活动是包含两个子活动的容器活动:当条件为真时执行第一个子活动,条件为假时执行第二个子活动。(引自 projects/elsa/README.md)

示例的业务场景很直观:假设手上有 200 元钱,判断是否足够购买一款任天堂游戏,并输出不同的提示信息。整个流程只用到一个If活动,外加一个Variable变量,非常适合作为理解 Elsa 工作流分支机制的入门样例。

二、If 活动的三个核心属性

根据 if-activity/README.md 的说明,If活动用于根据一个条件决定执行哪一组活动,它暴露了三个关键属性:

属性作用取值方式
Condition指定判断条件,决定走Then还是Else分支类型为Expression(示例中通过Input<bool>包裹条件表达式)
Then条件为true时执行的一组活动一个活动实例(如WriteLine)
Else条件为false时执行的一组活动一个活动实例(如WriteLine)

文档原文明确指出:Condition属性用于指定条件,Then属性用于指定条件为真时执行的活动,Else属性用于指定条件为假时执行的活动。在示例实现中(Program.cs),条件是以Lambda 表达式形式提供的:

new If { Condition = new Input<bool>(context => money.Get<int>(context) > 70), Then = new WriteLine("You have enough money purchase this Nintendo game"), Else = new WriteLine("You don't have enough money to purchase this Nintendo game") }

这里Condition接收一个以ActivityExecutionContext(即context)为参数、返回bool的表达式,外层用Input<bool>包装,使其同时支持静态值与运行时表达式两种输入方式。运行时,Elsa 会先求值Condition,再根据结果选择执行Then或Else分支——这正是 README 中所说"基于条件执行一组活动"的底层实现方式。

三、Variable 类:工作流变量的声明与读取

示例同时使用了Variable类来承载流程数据。README 中对其描述如下:

Variable类用于创建可在工作流中使用的变量,它有一个Name属性用于指定变量名,还有一个Value属性用于指定变量值。

在源码中,变量被声明并赋初值:

var money = new Variable<int>("money", 200);
  • Name="money":变量在流程内存中的标识;
  • Value=200:变量初始值,泛型参数int约束了类型。

变量通过所在容器(这里是Sequence)的Variables集合注册进工作流:

var workflow = new Sequence { Variables = { money }, Activities = { /* ... */ } };

在活动内部,通过money.Get<int>(context)读取当前值——这也是示例条件表达式的取值方式:context => money.Get<int>(context) > 70。由于money初值为 200 且 200 > 70,因此运行时会命中Then分支。需要强调的是,这里使用Variable.Get<T>(context)而不是直接读money.Value,是因为Variable存储在工作流的内存作用域(Elsa.Workflows.Memory命名空间)中,值需结合执行上下文解析,Value属性主要用于初始值设定。

四、完整源码逐行解读

示例工程包含四个文件:Program.cs、README.md、if-activity.csproj、if-activity.sln。核心逻辑全部位于Program.cs,可分四步理解:

第一步:搭建 Elsa 运行时。使用Microsoft.Extensions.DependencyInjection构建服务容器并注册 Elsa:

var services = new ServiceCollection(); services.AddElsa(); var serviceProvider = services.BuildServiceProvider(); var runner = serviceProvider.GetRequiredService<IWorkflowRunner>();

AddElsa()来自Elsa.Extensions命名空间,负责注册工作流引擎所需的全部服务;IWorkflowRunner是工作流执行入口,RunAsync用于运行工作流。

第二步:声明变量。创建名为money、类型int、初值 200 的变量(见上文)。

第三步:组装工作流。用Sequence容器包裹一个If活动。Sequence是 Elsa 的串行容器活动,会按添加顺序依次执行内部活动(参见 sequence-activity 示例)。

第四步:运行。调用await runner.RunAsync(workflow)执行工作流,控制台将输出:

You have enough money purchase this Nintendo game

若将money初值改为小于 70 的数(如 50),输出则变为You don't have enough money to purchase this Nintendo game,两条分支都可通过修改变量初值快速验证。

五、运行与工程配置

在仓库根目录下进入示例目录并运行:

cd projects/elsa/if-activity dotnet run

工程配置(if-activity.csproj)要点如下:

  • TargetFramework:net10.0,需要 .NET 10 SDK;elsa/global.json 指定 SDK 版本10.0.100(rollForward: major);
  • 包引用:Elsa3.7.1,这是 Elsa 3.x 的 NuGet 包;
  • 编译选项:ImplicitUsings启用隐式 using;LangVersion为preview;NoWarn抑制ASP0000警告(因为示例直接构建 ServiceProvider 而未走 Web 主机生命周期)。

该工程采用Microsoft.NET.Sdk.WebSDK 并附带解决方案文件 if-activity.sln,在 Visual Studio 或 Rider 中可直接打开运行。

六、If 在 Elsa 控制流活动家族中的位置

If并不是 Elsa 唯一的流程控制活动。仓库 projects/elsa/README.md 汇总了 17 个 Elsa 示例,其中与控制流相关的配套活动可以帮你建立整体认知:

  • Sequence(串行):按顺序执行一组活动,sequence-activity/Program.cs;
  • While(循环判断):同样拥有Condition属性,条件为真时持续执行Body,while-activity/Program.cs 演示了用While+SetVariable实现计数循环;
  • For / ForEach(计数与集合循环):在指定参数范围内或给定集合上循环执行;
  • Fork(并行分支):将流程拆成多个分支并行执行,fork-activity-2/Program.cs 展示了分支内通过SetVariable写变量、JoinMode = ForkJoinMode.WaitAll等待全部分支完成后再合并的写法;
  • Composite(组合):将一组活动封装为单个活动;
  • WriteLine / ReadLine(控制台输入输出):WriteLine在 writeline-activity/Program.cs 中有单独示例,是本文Then/Else分支里直接复用的活动。

可以看出,If属于"分支选择"类容器活动:它不自己执行业务,而是根据Condition的计算结果在两个子活动之间二选一。它与While共享"条件求值"机制,但While是循环、If是一次性分支——两者结合Sequence、Fork即可拼出绝大多数流程编排场景。

七、小结

通过 if-activity 示例,我们完成了对 ElsaIf活动的完整学习:

  1. Condition:以表达式(Input<bool>包裹 Lambda)指定判断条件;
  2. Then/Else:分别挂载条件为真/假时要执行的活动;
  3. Variable:通过Name/Value声明变量,注册进Sequence.Variables,在活动内用Get<T>(context)读取;
  4. 运行方式:dotnet run在 net10.0 + Elsa 3.7.1 环境下即可直接验证两条分支的输出。

如果你正在用 ASP.NET Core 构建需要流程编排的应用,这个示例是理解 Elsa 条件分支的最小可运行起点。进一步可对比阅读 projects/elsa/while-activity(循环判断)、projects/elsa/fork-activity-2(并行分支)以及 projects/elsa/setvariable-activity(变量修改),从而覆盖 Elsa 分支、循环、并行三大控制流原语。

  • 示例工程

【免费下载链接】practical-aspnetcore

Practical samples of ASP.NET Core 11, 10, 9, 8.0, 7.0, 6.0, 5.0, 3.1, 2.2, and 2.1,projects you can use. Readme contains explanations on all projects.

项目地址:https://gitcode.com/gh_mirrors/pr/practical-aspnetcore
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询