- 示例工程
【免费下载链接】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.
导读
本文基于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活动的完整学习:
Condition:以表达式(Input<bool>包裹 Lambda)指定判断条件;Then/Else:分别挂载条件为真/假时要执行的活动;Variable:通过Name/Value声明变量,注册进Sequence.Variables,在活动内用Get<T>(context)读取;- 运行方式:
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.
相关推荐
AJV条件验证:掌握if-then-else逻辑的终极实现指南
AJV条件验证:掌握if then else逻辑的终极实现指南 AJV(Another JSON Schema Validator)作为目前最快的JSON Sc
后端API设计现代 JavaScript 教程实战:用 if..else 条件分支实现数字符号判断(sign)
现代 JavaScript 教程实战:用 if..else 条件分支实现数字符号判断(sign) 本文以现代 JavaScript 教程(zh.javascri
文档教程workflow-core 条件分支(If)指南:用 .If(...).Do(...) 在 .NET 工作流中实现运行时决策
workflow core 条件分支(If)指南:用 .If ... .Do ... 在 .NET 工作流中实现运行时决策 本文以 workflow core
后端工作流自动化流程编排
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考