ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Elsa 输出转换器 Studio 创作契约:绑定编辑器、设置编辑器与兼容性数据保全指南

Elsa 输出转换器 Studio 创作契约:绑定编辑器、设置编辑器与兼容性数据保全指南 后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载导读本文以 Studio Authoring Contract 为核心骨架系统讲解 Elsa 工作流引擎中「活动输出转换器Output Converter」在 Elsa Studio 侧的完整创作契约绑定编辑器如何选择与持久化转换器、设置编辑器如何在 Schema 驱动与原始 JSON 之间切换、加载与兼容性规则如何保护已持久化的转换器配置以及独立验证清单如何保障端到端数据不丢失。读完本文你将掌握在 Studio 中选配、配置、保存、重开与清除输出转换器的全部行为约定并理解这些约定背后的服务端注册、REST 发现接口与源码级实现依据。一、契约背景Studio 在输出转换器架构中的角色输出转换器Output Converter是 Elsa 提供的可扩展机制工作流作者可以在某个活动输出绑定Output Binding上显式选择零个或一个已注册的转换器使目的地变量或工作流输出收到转换后的值而活动的原生输出保持不变。该功能的完整产品规格见 spec.md其关键设计决策记录在 ADR 0012Output converters use explicit stable identities——转换器通过稳定的、序数比较且区分大小写的 Converter ID被引用行为、设置或结果语义的任何破坏性变更都必须换用新 ID。在该架构中转换器描述符Descriptor的发现是服务端拥有的对应 FR-033/FR-034/FR-035。因此 Studio 侧契约FR-036明确规定Studio 必须消费服务端描述符 API而不是维护一份硬编码的转换器目录。Studio 的职责被收窄为三块根据输出与目的地类型向服务端查询兼容转换器提供 Schema 驱动的设置编辑或原始 JSON 编辑保证转换器配置在保存、重开、编辑等所有操作中不丢失、不被误改。下面逐一展开 studio-contract.md 的四个部分。二、绑定编辑器契约七条规则的逐条解读绑定编辑器Binding editor出现在 Studio 活动属性面板的 Outputs 选项卡中。契约针对每个活动输出for each activity output定义了七条行为规则规则 1目的地选择器保留身份与声明类型元数据现有的目的地选择器继续承担「目的地身份 声明类型元数据」的职责不因转换器功能而改变。目的地身份在数据模型中对应>TaskICollectionOutputConverterDescriptor GetOutputConvertersAsync( string sourceType, string destinationType, CancellationToken cancellationToken default);接口定义见 IOutputConverterService.cs其远程实现 RemoteOutputConverterService.cs 通过IBackendApiClientProvider取得 API 客户端并调用IOutputConvertersApi.ListAsync请求体携带SourceType与DestinationType。兼容性判定最终落在服务端注册表OutputConverterRegistry.FindCompatibleOutputConverterRegistry.cspublic IEnumerableOutputConverterDescriptor FindCompatible(Type sourceType, Type destinationType) ListAll().Where(x x.SourceType.IsAssignableFrom(sourceType) IsAssignableToDestination(x.ResultType, destinationType));即描述符的源类型必须可以从输出的声明类型赋值支持基类/接口的普通可赋值性其结果类型必须可以赋值给目的地类型NullableT的底层类型同样视为可赋值。规则 3Studio 显示带 None 选项的可选 Converter 选择器转换器选择器是可选的且始终提供None不使用转换器选项。None对应「未配置转换器」的绑定此时行为与旧版完全一致直接走原有的原生值赋值路径不触发任何转换器注册表查询、兼容性校验或调用对应 spec.md 中 FR-015「不得从类型对推断转换器选择」与 FR-003「无转换器配置时保持既有序列化形态与赋值行为」。规则 4选择转换器时只把 ID 与设置写入活动输出 JSON当作者选定某个转换器后Studio只写两样东西id与settings。不得持久化实现类型名、实例、描述符或展示元数据FR-004。序列化形态由>{ typeName: String, memoryReference: { id: resultVariable }, converter: { id: sample.to-text, settings: { format: compact } } }其中converter对象就是 OutputConverterConfiguration.cs 中的OutputConverterConfigurationId为必填的非空稳定 IDSettings为可选的 JSON 对象且在持久化或调用时都会被克隆settings?.Clone()保证不可变性。规则 5清除转换器即移除整个可选对象作者在编辑器中选择None或执行「清除」操作后序列化结果中不再存在converter键绑定恢复为未配置形态即恢复原有的未转换赋值行为对应 spec 中 User Story 4 的验收场景 5 与 FR-002。测试层面由序列化测试与 Studio 往返测试共同覆盖见 completion.md 的 FR-001/FR-002 证据列。规则 6更换目的地仅在「不再兼容」时才清除转换器这是数据保全的核心规则目的地的变化只会让不再兼容的转换器选择失效兼容的转换器保留。也就是说判断依据是「描述符结果类型是否仍可赋值给新目的地类型」而不是「目的地字符串是否变化」。这一行为既保护作者已经配置好的设置又避免把无效配置静默带上路而真正不再兼容的选择会被失效处理保证不会把不兼容的转换结果写入新目的地对应 FR-018 与 invoker 的结果校验。规则 7无关的活动编辑必须精确保留转换器 JSON作者修改活动名称、表达式或其他属性时绑定上的converter对象ID 与设置必须逐字节等价地保留。这是 SC-006「转换器配置经受住服务端序列化、API 客户端往返、Studio 编辑与工作流重开而不丢失或变更」的组成部分对应 Studio 测试套件中的 Outputs 选项卡往返测试。三、设置编辑器契约Schema 驱动与原始 JSON 回退设置编辑器Settings editor遵循一条明确的分级策略对应 FR-039Schema 驱动表单受支持的 JSON Schema 构造当所选转换器的描述符携带受支持的 object JSON Schema时Studio 渲染字段化表单。契约明确列出的受支持构造包括字段类型string、number、integer、boolean取值约束enum元数据required、title、description、default。以 REST 契约rest-api.md中的示例描述符为例{ id: sample.to-text, sourceTypeName: Sample.Source, resultTypeName: String, displayName: Convert to text, description: Formats the source as text., settingsSchema: { type: object, properties: { format: { type: string, enum: [compact, indented] } } } }Studio 的设置编辑器实现位于 OutputConverterSettingsEditor.razor.cs。其BuildFields方法逐条验证Schema 必须是type: object且含properties对象每个属性按type映射为文本、数字、整数、布尔或枚举输入required数组用于标记必填字段title/description用于标签与提示。枚举值只接受字符串与数字如format的compact/indented数字输入按InvariantCulture做decimal.TryParse/long.TryParse校验必填字段留空会就地给出「This setting is required.」的本地化错误。原始 JSON 回退无 Schema 或含不支持的构造当描述符没有 Schema或 Schema 含编辑器不支持的构造如非 object 顶层、数组/对象类型的嵌套属性、字符串之外的枚举取值等时Studio 回退到原始 JSON 对象编辑器。BuildFields中任何不支持情况都会清空字段列表返回从而自动切换到_rawSettings文本编辑。这正是契约中「raw JSON editor is an acceptable fallback」的落地spec 的 Assumptions 也明确原始 JSON 编辑器是无 Schema 或缺少专用表单控件时的可接受回退方案。本地校验与服务器权威校验的分工本地校验格式非法或非对象的 JSON 在本地直接拒绝——OnRawSettingsChangedAsync中JsonNode.Parse失败或结果不是JsonObject时会抛出JsonException随即显示「Converter settings must be a valid JSON object.」且不会把无效值回传给绑定。服务端权威校验本地校验只是第一道闸门服务端定义校验信息如未知 ID、类型不兼容、设置 Schema 校验失败或转换器自定义校验失败始终具有权威性并会被呈现给作者。运行时的完整校验链可见 OutputConverterInvoker.cs依次进行注册解析Resolution、源类型兼容SourceCompatibility、结果类型可赋值ResultValidation、设置校验SettingsValidation经IOutputConverterSettingsValidator执行 Schema 校验与转换器自身ValidateSettings、调用Invocation与最终结果/可空性校验。只读工作区只读工作区read-only workspace中的作者不能修改转换器选择或设置编辑器通过IsReadOnly参数禁用选择器与表单控件避免在无法保存的上下文中产生误导性的可编辑状态。四、加载与兼容性契约保护持久化配置的四条防线防线 1取消或忽略过期的描述符请求当输出/目的地选择发生快速连续变化时前一次查询发出的描述符请求可能已过期。Studio 必须取消或忽略陈旧响应只采纳与当前「输出 目的地」选择匹配的结果防止出现列表与当前绑定错位。防线 2旧服务器优雅降级绝不删除已持久化配置如果连接的是不支持描述符发现的旧版服务端Studio 应隐藏或禁用新控件而不是报错或破坏数据已持久化的转换器配置保持原样等待服务端升级或作者后续处理。这与 FR-035「描述符 API 响应只暴露 ID、支持类型、本地化展示元数据与可选设置 Schema」共同保障了版本偏移场景下的安全性。防线 3未知 Converter ID 显示而非静默清除当工作流中持久化的 Converter ID 在服务端已不存在例如部署被替换、注册被移除时Studio 必须展示该 ID 及其校验状态而不是静默清除。这一设计直接呼应 spec 的 Edge Case「A converter is removed, replaced incompatibly, or registered differently between validation and execution deployments」与 User Story 3持久化工作流可以比部署活得更久作者有权看到配置所指的转换器已失效而不是眼睁睁看着配置被悄悄抹掉。防线 4本地化与 ID 回退Studio 自有的标签与错误信息使用本地化文案如上面提到的必填提示、数字格式提示、JSON 对象提示均经Localizer服务端返回的展示文本缺失时界面回退显示 Converter ID。这样即使描述符没有displayName作者依然能凭 ID 识别转换器。五、独立验证清单如何证明契约成立studio-contract.md 的第四部分「Independent verification」给出了四条可执行的验证断言它们是 Studio 自动化测试的直接依据查询参数使用所选声明的源与目的地类型请求sourceType/destinationType必须来自当前绑定中已声明的输出类型与目的地类型而非推断或猜测值。选择、配置、保存、重开、清除完整往返正确一次完整的「选择转换器 → 编辑设置 → 保存工作流 → 重开工作流 → 清除转换器」必须产出正确且一致的序列化结果。这正是 SC-006 的 Studio 部分。目的地变更只使不兼容的转换器选择失效验证规则 6 的行为边界——兼容保留、不兼容失效、数据不静默丢失。只读、服务不可用、未知 ID、设置损坏四种状态下工作流数据被保全即「任何异常/受限场景下都不丢数据」。上述验证在仓库中有对应的自动化证据OutputsTabConverterTests.cs 覆盖 Outputs 选项卡的选择与往返含数组目的地场景OutputConverterSettingsEditorTests.cs 覆盖 Schema 驱动编辑与原始 JSON 回退RemoteOutputConverterServiceTests.cs 覆盖 Studio 对描述符 API 的消费。根据 completion.md 的验证日志Studio 输出转换器测试共 9 项在net10.0上全部通过。六、契约背后的服务端与 API 支撑Studio 契约之所以能够「轻装上阵」是因为服务端承担了发现与校验职责描述符 REST 接口Endpoint.cs 实现了契约规定的查询端点GET /descriptors/output-converters?sourceType{typeName}destinationType{typeName}端点要求权限read:*或read:output-converters对应 REST 契约的授权说明两个查询参数都是必需的缺失或无法解析时返回400无权限时返回403类型名必须是已注册的类型别名或可解析的安全类型名——端点内部通过SerializationTypeResolver解析并在Map时把 CLR 类型投影为别名或安全的程序集限定名杜绝实现类型信息泄露FR-035响应体只含安全描述符字段id、sourceTypeName、resultTypeName、displayName、description、settingsSchema见 rest-api.md 的响应示例。API 客户端契约客户端契约 IOutputConvertersApi.cs 与服务端一一对应[Get(/descriptors/output-converters)] TaskListOutputConvertersResponse ListAsync( [Query] ListOutputConvertersRequest request, CancellationToken cancellationToken default);ListOutputConvertersRequest携带SourceType与DestinationTypeListOutputConvertersResponse是OutputConverterDescriptor的集合使用字符串与JsonElement?镜像安全描述符形态。该客户端在 DependencyInjectionExtensions.cs 中通过AddApiIOutputConvertersApi注册。Studio 的消费方式RemoteOutputConverterServiceRemoteOutputConverterService.cs是 Studio 契约「不维护硬编码目录」的直接体现每次需要候选列表时它都实时向服务端发起带两个类型参数的查询结果直接绑定到转换器选择器。服务端描述符的注册与唯一性校验则由 OutputConverterServiceCollectionExtensions.cs 的AddOutputConverterTConverter保证——以 Converter ID 作为 keyed-service 的服务键并在注册时拒绝空 ID、重复 ID 以及仅大小写不同的 ID。七、端到端状态流与数据保全保证把 Studio 契约放回完整的运行时状态机data-model.md中可以更清楚地看到「作者在 Studio 里做出的每个选择最终如何被运行时兑现」Unconfigured Binding └─ assign native value using existing path Configured Binding ├─ record native output ├─ native null → validate destination nullability → write null └─ non-null ├─ resolve registration and destination ├─ validate source, destination, and settings ├─ invoke converter ├─ validate result and nullability ├─ success → write Bound Value └─ failure → fault activity; destination unchanged对 Studio 而言有两点尤其重要转换只作用于 Bound Value活动输出寄存器、日志、API 响应与诊断始终暴露原生输出FR-005/FR-006Studio 的输出观察面不会因转换器而失真失败不写目的地任何阶段的失败Resolution、SettingsValidation、SourceCompatibility、Invocation、ResultValidation都会通过 Elsa 正常活动故障管线产生带结构化元数据ConverterId、Stage、ActivityId、OutputName、DestinationId 等的 Output Conversion Error目的地保持不变、原生输出保留、原始异常作为 InnerException 保留且默认错误消息不包含原生值与原始设置FR-029FR-032——这正是 Studio 设置编辑器「服务端校验信息必须上浮给作者」背后的安全语义。八、验证证据汇总根据 completion.mdStudio 契约对应的需求FR-036FR-039与成功标准SC-005、SC-006均已由自动化测试佐证契约条目对应需求/标准证据来源使用 API 发现而非硬编码目录FR-036/FR-037RemoteOutputConverterServiceTests、Outputs-tab 测试按声明类型过滤候选FR-037Outputs-tab 测试含数组目的地选择/配置/清除/重开/校验FR-038Outputs-tab 与 settings-editor 测试Schema 驱动 原始 JSON 回退FR-039settings-editor 测试完整创作流程SC-005两分钟阈值属发布级手动 UX 验收SC-005自动化组件流程配置在各处往返不丢失SC-006Core 序列化、API 客户端、Studio 测试结语Elsa Studio 的输出转换器创作契约可以概括为三句话绑定编辑器负责「选得准、存得少」只持久化 ID 与设置且仅在目的地不再兼容时才失效设置编辑器负责「该表单就表单、该 JSON 就 JSON」Schema 驱动优先原始 JSON 兜底服务器校验始终权威加载与兼容性规则负责「宁可显示也不静默删」旧服务器、未知 ID、损坏设置等任何异常状态下都保全工作流数据。这套契约配合服务端注册表、描述符 REST 接口与运行时故障管线共同保证了转换器功能在 Studio 侧可以安全、无损地完成全生命周期操作。想深入实现细节的读者可从 spec.md、data-model.md、rest-api.md 与 runtime-contract.md 继续追踪。赞分享后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载相关推荐vault CLI 的 --json 输出规范全解析面向脚本、编辑器与 CI 的稳定 Schema 契约vault CLI 的 json 输出规范全解析面向脚本、编辑器与 CI 的稳定 Schema 契约 导读 vault 是 StaffML 题库工程vaul教育教程人工智能机器学习Elsa 3 输出转换器Output Converters完全指南在绑定边界同步、显式、可发现地转换 Activity 输出Elsa 3 输出转换器Output Converters完全指南在绑定边界同步、显式、可发现地转换 Activity 输出 本篇技术指南聚焦 Elsa后端工作流自动化流程编排低代码.NET MAUI 数据绑定实战指南编译绑定、MVVM 与转换器全解析.NET MAUI 数据绑定实战指南编译绑定、MVVM 与转换器全解析 本指南基于开源仓库 skills17/skills 中 dotnet maui 插件的人工智能AI 技能AI 评测Benchmark开发工具上一篇FastAPI异步测试高效事件循环共享策略指南下一篇Godot 多平台导出实战预设一次配置六大平台发布不踩坑创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表