practical-aspnetcore 实战:在 Elsa 工作流引擎中使用 For 活动实现参数化循环
示例工程【免费下载链接】practical-aspnetcorePractical 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 仓库中 projects/elsa/for-activity 示例项目系统讲解 Elsa 工作流引擎Elsa Workflows.NET 版 3.7.1中For循环活动的完整用法如何通过Start、End、Step三个参数控制循环的起始、终止与步长如何借助Body属性编排循环体内的工作流活动以及如何配合Variable类在循环过程中读取、更新与传递状态。阅读本文后你将能够在 ASP.NET Core 应用中独立编写可运行的 Elsa 参数化循环工作流并理解其与While、ForEach等循环活动在适用场景上的差异。示例项目概览一个最小的 For 循环工作流for-activity示例位于 projects/elsa/for-activity是一个控制台风格的 .NET 项目工程文件 for-activity.csproj 展示了其运行前提Project SdkMicrosoft.NET.Sdk.Web PropertyGroup TargetFrameworknet10.0/TargetFramework ImplicitUsingstrue/ImplicitUsings NoWarnASP0000/NoWarn LangVersionpreview/LangVersion /PropertyGroup ItemGroup PackageReference IncludeElsa Version3.7.1 / /ItemGroup /Project要点解读目标框架为net10.0与本仓库根目录 global.json 声明的 SDK10.0.100rollForward: major保持一致运行前请确保本机已安装 .NET 10 SDK项目以Microsoft.NET.Sdk.Web作为基础 SDK并引入Elsa3.7.1 包——Elsa 是面向 .NET 的通用工作流引擎既可作为库嵌入应用也可独立托管运行详见 projects/elsa/README.md 的总体介绍NoWarn与LangVersion属于构建期配置用于兼容基于 ServiceCollection 手动宿主Hosting的样例代码写法。在 projects/elsa/for-activity 目录下可直接运行dotnet runFor 活动四个核心属性构建参数化循环原文档明确指出For活动用于在指定参数范围内循环执行工作流。它拥有四个核心属性属性类型作用Start数值指定循环的起始值End数值指定循环的结束值Step数值指定每次迭代的步长增量Body活动容器指定循环体即每次迭代要执行的工作流活动集合这四个属性共同把 C# 中经典的for (int i start; i end; i step)语义完整映射到了工作流层面引擎从Start开始每执行完一轮Body后将当前值累加Step直到超过End为止。由于这些参数都是可配置的输入值开发者可以在不修改工作流定义的前提下通过传入不同的Start/End/Step组合控制循环次数与推进方式例如步长为 2 的奇数序列、步长为负的倒序循环。Variable 类循环中承载状态的工作流内存变量For循环只有在能感知当前迭代到了哪个值时才有实际意义这需要借助 Elsa 的Variable类。原文档定义了它的两个核心成员属性作用Name指定变量在运行上下文中的唯一名称供工作流活动按名引用Value指定变量的初始值VariableT是泛型类在声明时即可确定类型与初值例如示例中的new Variableint(counter, 1)名称counter类型int初值1。在 Elsa 的架构中变量存放于工作流内存Workflow Memory的变量区块内活动通过contextActivityExecutionContext读写。从源码结构看For活动的CurrentValue属性类型Outputobject负责把当前迭代值输出到外部变量这正是循环计数与循环体通信的桥梁。源码级拆解完整可运行的 For 循环示例Program.cs 是本示例的完整实现逐段拆解如下。1. 引导宿主与工作流运行器var services new ServiceCollection(); services.AddElsa(); var serviceProvider services.BuildServiceProvider(); var runner serviceProvider.GetRequiredServiceIWorkflowRunner();AddElsa()把工作流引擎所需的全部服务活动解析、执行器、内存存储等注册进ServiceCollection随后从容器中解析出IWorkflowRunner——它是整个 Elsa 工作流执行的入口负责接收并运行工作流实例。这一段与仓库中所有 Elsa 示例如 writeline-activity/Program.cs、while-activity/Program.cs完全一致可以视为 Elsa 嵌入式开发的固定引导模板。2. 声明循环计数器变量var counter new Variableint(counter, 1);创建名为counter、初值为1的整型变量后续循环的当前值将写入这里。3. 组装工作流Sequence 容器包裹 For 活动var workflow new Sequence { Variables { counter }, Activities { new For(start: 1, end: 10, step: 1) { CurrentValue new Outputobject(counter), Body new Sequence { Activities { new WriteLine(context $Counter {counter.Get(context)}), new SetVariableint(counter, context counter.Get(context) 1) } } } } };逐层解读外层Sequence顺序容器活动把counter变量注册到工作流内存Variables { counter }并按顺序执行内部活动Sequence活动的语义可参考 sequence-activity 示例new For(start: 1, end: 10, step: 1)以位置参数/命名参数形式指定循环范围——从 1 开始、到 10 结束、步长为 1预计迭代 10 轮。For构造函数直接接收这三个数值也可改用属性赋值方式CurrentValue new Outputobject(counter)把For活动的当前迭代值绑定到counter变量。Outputobject是 Elsa 中表示活动输出的类型For每轮产生的当前值会通过该输出写入目标变量Body内的Sequence循环体使用WriteLine打印当前计数再用SetVariableint将计数加 1。这两类活动分别演示于 writeline-activity 与 setvariable-activity 示例——其中WriteLine(context ...)的写法体现了上下文委托模式活动执行时引擎会把当前执行上下文传入委托供读取counter.Get(context)等内存变量。4. 运行工作流await runner.RunAsync(workflow);RunAsync同步执行完整流程。运行后控制台将依次输出Counter 1到Counter 10共 10 行。与 While、ForEach 的对比三种循环活动如何选型For只是 Elsa 循环家族的一员理解三者差异有助于正确选型活动循环依据典型场景参考示例For由Start/End/Step构成的数值区间固定次数、步进可控的循环如批量处理 1..10for-activity/Program.csWhile布尔Condition表达式条件驱动、次数未知的循环如counter 10while-activity/Program.csForEach一个集合Items属性遍历集合元素每元素执行一轮foreach-activity/Program.cs值得注意的实现细节示例中的For循环体内仍显式调用了SetVariableint完成自增这说明For活动的Start/End/Step与当前值变量之间是输出绑定关系——引擎按Step推进迭代但工作流内是否有状态自增逻辑由开发者决定。相比之下While完全依赖条件表达式驱动见 while-activity/Program.cs 中context counter.Get(context) 10的写法两者在谁来推进循环上的分工不同这一差异从源码结构可以清晰推断。进阶要点与常见坑位变量读写必须经由上下文VariableT.Get(context)是读取当前值的标准方式counter.Value只是声明时的初始值运行期状态应以Get(context)为准该约定贯穿全部示例参见 setvariable-activity/Program.cs 中连续SetVariable后再次WriteLine(msg.Get)的用法。CurrentValue是 For 的关键输出若省略CurrentValue绑定循环体将无法感知当前迭代序号绑定后还应确保该变量已注册到外层Sequence.Variables否则运行时会因变量未注册而取值失败。负步长与边界语义Step为负数时可用于倒序循环End的边界判定语义为未越过 End 前继续执行具体边界行为以 Elsa 3.7.1 版本实际实现为准复杂场景建议先用WriteLine打印验证迭代次数。宿主引导顺序IWorkflowRunner必须从构建好的ServiceProvider中解析且要放在AddElsa()之后否则引擎服务未注册。小结通过本示例可以看出在 practical-aspnetcore 的 Elsa 系列中for-activity 用最精简的方式演示了数值区间 循环体 状态变量这一工作流编程的经典组合。For活动的Start/End/Step/Body四个属性与Variable类的Name/Value配合即可在 .NET 应用中构建可配置、可复用的循环逻辑若需继续深入可依次研读 while-activity、foreach-activity 以及 sequence-activity 等相邻示例逐步掌握 Elsa 工作流的完整控制流能力。赞分享示例工程【免费下载链接】practical-aspnetcorePractical 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 ForEach 活动基于集合驱动循环工作流practical aspnetcore 实战用 Elsa ForEach 活动基于集合驱动循环工作流 本指南以 foreach activity https示例工程practical-aspnetcore 仓库 Elsa 工作流 SetName 活动实战为工作流实例命名并从 WorkflowExecutionContext 读取practical aspnetcore 仓库 Elsa 工作流 SetName 活动实战为工作流实例命名并从 WorkflowExecutionContex示例工程基于 Elsa 3.7.1 的 .NET 工作流实战从基础 Activity 到自定义工作流practical-aspnetcore 仓库 Elsa 17 例详解基于 Elsa 3.7.1 的 .NET 工作流实战从基础 Activity 到自定义工作流practical aspnetcore 仓库 Elsa 17示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考