六款 .NET 工作流引擎:二开能力怎么比
对比对象:Elsa Workflows、Workflow Core、WorkflowEngine.NET、StepWise、CCFlow、Slickflow
资料依据:各产品公开文档 / GitHub / 官方站点,
写作原则:先统一「二开」定义,再按同一维度对照;有优势写优势,有短板写短板;不因场景不同而强行打成「总分第一」
一、先说清楚:什么叫「流程引擎的二开」
1.1 定义(本文口径)
流程二开 = 流程设计(或代码定义)完成后,在不改引擎内核的前提下,用脚本 / 代码 / 配置与引擎交互,把业务逻辑挂到固定生命周期点上的过程。
典型动作:发送前校验、发送后同步第三方、退回拦截、流程结束写台账、自定义活动节点、自定义设计器控件等。
| 对比项 | 改引擎源码 | 流程二开(本文范围) |
|---|---|---|
| 改动位置 | 发送/退回/调度内核 | 外挂、事件、自定义 Activity/Step、配置执行体 |
| 升级成本 | 高,难合并 | 相对低,核心可独立升级 |
| 职责边界 | 引擎与业务缠在一起 | 引擎管流转,二开管业务 |
| 可交付性 | 难复用 | 可按流程模板 / 模块绑定交付 |
1.2 二开范围(纳入 / 不纳入)
为避免「什么都能叫二开」导致对比失真,本文把二开拆成 6 个可核对能力面:
| 编号 | 能力面 | 含义 | 典型载体 |
|---|---|---|---|
| D1 | 生命周期挂接 | 发送/完成/退回/结束等时机能否挂业务 | 事件、中间件、Action、钩子 |
| D2 | 自定义步骤/活动 | 能否扩展流程「积木块」 | Custom Activity / Step / ServiceTask |
| D3 | 前端 / UI 扩展 | 设计器、办理页、按钮、表单交互能否外挂 | Studio 插件、模板、前端外挂 |
| D4 | 配置化集成 | 少写代码能否挂 SQL / WebApi / 过程 | 设计器事件配置、CodeAction、DSL |
| D5 | 人机审批语义扩展 | 待办、会签、退回等业务语义是否可直接挂业务 | 审批模型 + 事件 |
| D6 | 模块化与可升级性 | 扩展是否可独立部署、少改核 | 插件、程序集扫描、Override |
明确不纳入「二开能力」本身、但会影响选型的因素(文末单独提示):许可费用、社区活跃度、是否内置表单/组织门户。这些会影响「能不能用二开把项目做完」,但不是二开机制本身的强弱。
1.3 公平原则(阅读说明)
- 定位不同,不能只比「有没有审批」:Elsa / Workflow Core / StepWise 更偏编排;CCFlow / Slickflow 更偏 BPM;WorkflowEngine.NET 偏可嵌入商业引擎。
- 「能扩展」≠「开箱就是审批系统」:例如 Elsa 可用 Bookmark 做人工等待,但会签/加签/组织待办通常要自建。
- CCFlow 章节结合本仓库源码举证;其余产品以公开文档为准,不臆造未公开能力。
- StepWise 纳入对比是为防误选:它是代码优先的步骤/AI 任务编排框架,不是传统 OA/BPM 引擎。
二、六款产品定位一览(二开语境)
| 产品 | 大致定位 | 二开主路径(公开资料) | 更像什么 |
|---|---|---|---|
| Elsa Workflows | .NET 通用长流程编排 + Studio | Custom Activity、Module/Feature 插件、Middleware、Bookmark | 开发者编排平台 |
| Workflow Core | 轻量嵌入式流程库 | 自定义 StepBody、中间件、JSON/YAML DSL | 库级编排内核 |
| WorkflowEngine.NET | OptimaJet 可嵌入引擎(生产多需商业许可) | IWorkflowActionProvider、CodeActions、Plugins、Custom Activity 表单 | 商业组件式引擎 |
| StepWise | 代码优先、事件驱动步骤框架 | [Step] / [DependsOn] 方法即步骤,WebUI 可视化执行 | 开发/AI 任务编排 |
| CCFlow | 流程 + 表单 + 组织一体化 BPM | 前端外挂 / 后端外挂 / 事件配置 三模式 | 中国式审批 / 政企 BPM |
| Slickflow | BPMN 风格 .NET 引擎 + 设计师 | IExternalService、WebApi、SQL/过程、C# 类库、WorkflowService API | 标准向嵌入式 BPM 引擎 |
三、二开能力总对照表(同一维度)
评级口径:强 = 产品级、文档/样例完整;中 = 能做但需自建较多;弱 = 基本不覆盖或需从零实现。评级是机制完整性,不是「业务场景总分」。
| 能力面 | Elsa | Workflow Core | WorkflowEngine.NET | StepWise | CCFlow | Slickflow |
|---|---|---|---|---|---|---|
| D1 生命周期挂接 | 强(Activity 执行模型 + Middleware) | 强(Step + Workflow/Step Middleware) | 强(Action / Condition / Runtime 事件) | 中(步骤依赖图,非审批事件时钟) | 强(节点/流程事件清单产品化) | 强(节点 Action / ServiceTask) |
| D2 自定义步骤/活动 | 强(官方一级能力) | 强(StepBody 即扩展单元) | 强(Custom Activity + Action Provider) | 强(方法即 Step,本就代码优先) | 中偏强(事件/业务单元为主,非「画布积木」叙事) | 中偏强(ExternalService + 多种执行体) |
| D3 前端 / UI 扩展 | 中偏强(Studio 元数据 / UIHint,业务办理页多自建) | 弱(基本无产品级办理 UI) | 强(设计器模板 / Vue 表单可定制) | 中(自带 WebUI,偏调试执行,非审批工作台) | 强(Vue3 前端外挂 WGFlow_*) | 中(设计师可嵌入,业务页多自建) |
| D4 配置化集成 | 中(表达式/活动组合强,SQL/实施配置弱于 BPM) | 中(JSON/YAML 引用 Step 类型) | 强(方案内 CodeActions + 插件) | 弱(几乎全是代码) | 强(设计器事件 + GenerDBSrc:SQL/WebApi/过程等) | 强(本地类/WebApi/SQL/过程/C# 库) |
| D5 人机审批语义扩展 | 中(Bookmark/人工等待可自建,审批语义需自造) | 弱偏中(有 Users 扩展,审批要自建) | 中偏强(命令/角色/Assignment,完整 OA 仍需自建) | 弱(非审批模型) | 强(审批动作与事件时钟对齐) | 强(BPMN 任务 + 引擎 API,表单/组织视版本) |
| D6 模块化与可升级性 | 强(Module/Feature/NuGet 扩展) | 强(库嵌入 + DI) | 强(Plugin 体系) | 强(项目内代码即扩展) | 强(业务程序集 / Vue 外挂目录,约定不改核) | 强(接口 + 反射服务类) |
一句话读表
| 如果你更关心… | 相对更贴的产品 |
|---|---|
| 自定义「流程积木」与云原生编排扩展 | Elsa、Workflow Core |
| 设计器里写 Action / 插件化商业嵌入 | WorkflowEngine.NET |
| 用 C# 方法快速编排可并行步骤 / AI | StepWise |
| 审批生命周期上挂业务,且前端也能挂 | CCFlow |
| BPMN 节点上挂本地服务 / WebApi / SQL | Slickflow |
四、分引擎:二开机制怎么落地(公开资料摘要)
4.1 Elsa Workflows
| 项 | 内容 |
|---|---|
| 核心扩展点 | Custom Activity(CodeActivity / Activity / Trigger)、Module & Feature、Activity Middleware、Studio 元数据 |
| 人机介入 | Bookmark 阻塞等待;外部系统通过 Resume / HTTP Trigger 恢复;官方有 Human-in-the-loop 模式说明 |
| 二开体验 | 对 .NET 开发者极友好;扩展可打成 NuGet;Studio 与运行时对齐是关键 |
| 坦诚短板 | 审批会签/组织待办/表单工作台不是开箱能力,多靠自建活动 + 外部应用;V2→V3 无自动迁移,扩展要重写 |
适合的二开场景:微服务编排、Webhook/长事务、领域自定义活动库。
不太适合指望「只配不写」的:政企审批实施团队纯配置交付。
4.2 Workflow Core
| 项 | 内容 |
|---|---|
| 核心扩展点 | 继承 StepBody / StepBodyAsync;DI 注入;IWorkflowMiddleware / IWorkflowStepMiddleware;JSON/YAML DSL 引用 Step 全名 |
| 人机介入 | 社区有 Users 等人机相关扩展,但不是完整 BPM 产品面 |
| 二开体验 | 极简、嵌入成本低;Step 即业务单元,学习曲线短 |
| 坦诚短板 | 几乎没有产品级设计器/表单/待办门户;二开 = 写代码 + 自建 UI |
适合:嵌入现有系统做状态机/后台编排。
不适合:指望「设计器 + 事件配置」完成项目交付。
4.3 WorkflowEngine.NET(OptimaJet)
| 项 | 内容 |
|---|---|
| 核心扩展点 | IWorkflowActionProvider(Action/Condition)、方案内 CodeActions、IWorkflowPlugin、Custom Activity(含 HTML/SVG 模板)、规则提供者等 |
| 前端扩展 | 设计器模板高度可定制(工具栏、表单、画布元素);可与 React 等集成 |
| 二开体验 | 文档完整,插件模型清晰;CodeActions 可在设计器内编译调试 |
| 坦诚短板 | 生产许可通常为商业授权(源码可见 ≠ 免费商用);完整 OA(表单/组织/移动)仍需自建或另购生态 |
适合:要嵌入高质量设计器 + Action 扩展的商业项目。
选型时必须单独评估:许可成本与锁定风险。
4.4 StepWise
| 项 | 内容 |
|---|---|
| 核心扩展点 | 类方法 + [Step] / [DependsOn] / [FromStep];引擎自动并行与依赖解析;WebUI 可视化执行;可对接 MCP / AI |
| 二开体验 | 「写方法就是扩展」——对开发者极直接 |
| 坦诚短板 | 不是 BPM:无会签/退回/组织待办等审批事件时钟;配置化实施路径弱 |
适合:数据分析、批处理、AI Agent 步骤流。
误选风险:名字像工作流,但交付审批系统会从零造轮子。
4.5 Slickflow
| 项 | 内容 |
|---|---|
| 核心扩展点 | 节点 Action:本地类(ExternalServiceBase + IExternalService)、WebApi、SQL、存储过程、C# 类库;WorkflowService API(Start/Run/Jump/Withdraw/Sendback 等) |
| 二开体验 | BPMN 语义清晰;ServiceTask 文档对「二次开发」有明确示例;反射约束基类/接口,避免乱挂 |
| 坦诚短板 | 表单/门户/组织完整度依赖产品线版本(社区版与商业能力常分层);前端「办理页外挂协议」不如 CCFlow 产品化 |
适合:要 BPMN + 节点级服务调用、以 API 嵌入业务系统。
相对弱于 CCFlow 的点:前后端统一事件协议、低代码事件配置与表单一体化深度。
4.6 CCFlow(结合本仓库)
| 项 | 内容 |
|---|---|
| 核心扩展点 | 三种并列模式:前端外挂、后端外挂、事件配置(详见第五节) |
| 统一调度 | 服务端 ExecEvent:全局拦截 → FlowEventBase → FrmEvents/GenerDBSrc → 消息推送 |
| 二开体验 | 事件名产品化(SendWhen / SendSuccess / FlowOverAfter 等);前端与后端认同一套时钟 |
| 坦诚短板 | 扩展叙事偏「审批事件挂业务」,不是 Elsa 那种「自定义画布 Activity 生态」;技术栈与约定需学习(WGFlow_、FlowMark、程序集扫描) |
五、CCFlow 三种二开方式(结合代码)
驰骋 BPM 的主张可以概括为:
流程可以设计出来,业务却不能写进引擎内核。
同一套事件语义,三种写法:前端外挂、后端外挂、事件配置。
5.1 三种模式总览
| 模式 | 一句话 | 谁写 | 典型载体(本仓库) |
|---|---|---|---|
| 前端外挂 | 浏览器侧挂流程脚本 | 前端 / 全栈 | Vue3/src/bp/UIEntity/WaiGuaBaseFlow.ts、Vue3/src/App/Demo/WGFlow_*.ts、OverrideFiles |
| 后端外挂 | 服务端强类型事件类 | 后端 | BP.WF.FlowEventBase、BP.App/Demo/F065.cs、OverrideEvent |
| 事件配置 | 设计器里配执行体 | 实施 / 低代码 | Sys_FrmEvent(BP.En30)、EventBase / BuessUnitBase、GenerDBSrc |
运行时分层(示意):
用户点击发送
├─ ① 前端外挂:WGFlow_* / beforeSend ← 可拦截(UI 侧)
└─ ② HTTP → 流程引擎发送编排
└─ ExecEvent(统一调度)
├─ OverrideEvent(全局后端拦截)
├─ FlowEventBase(流程级后端外挂)
├─ FrmEvents / GenerDBSrc(事件配置)
└─ PushMsgs(消息推送,同事件标记)
└─ ③ 前端 SendSuccess / afterSend ← 发送成功后的前端副作用
5.2 模式一:前端外挂
意图:人还在页面上时,做校验、提示、按钮与交互定制。
约定:类名必须以 WGFlow_ 开头,并绑定流程号。
protected constructor(classID: string, flowNo: string) {
if (classID.includes('WGFlow_') == false) {
message.warning('外挂类名[' + classID + ']不符合规范,必须是以 WGFlow_ 开头.');
return;
}
super(classID);
this.FlowNo = flowNo;
}
Demo(流程 064):发送前可返回 err@... 阻断发送;发送成功后再做前端副作用。
export class WGFlow_064 extends WaiGuaBaseFlow {
constructor() {
super('WGFlow_064', '064'); //注册到 064模板的流程上.
}
// ...
protected override async SendWhen() {
if (this.NodeID == 6401) {
const msg = `
##### 提示信息
1. 成功激活了/src/App/Demo/WGFlow_064.ts 的 SendWhen事件.
2. 如果return err@xxxxxxx 则流程不向下发送.
`;
return msg;
}
return '';
}
工具栏实际调用链见 Vue3/src/WF/ToolBar.vue(先 SendWhen / beforeSend,服务端成功后再 SendSuccess / afterSend)。
| 适合 | 不适合单独承担 |
|---|---|
| 表单即时校验、按钮定制、成功提示、局部刷新 | 强事务写库、跨系统强一致同步 |
5.3 模式二:后端外挂
意图:进入服务端生命周期后,用可调试的强类型代码介入;可改跳转节点/接收人,可同步第三方。
基类约定(源码注释原文要点):
- 子类重写事件方法与基类交互
- 一个子类必须与一个流程模版绑定(
FlowMark) - 基类暴露运行时变量辅助复杂逻辑
- 类需进入
BP.*.dll才能被反射解析
Demo:
public class F065 : FlowEventBase
{
public override string FlowMark
{
get { return ",065,"; }
}
public override string SendWhen()
{
if (1 == 3)
return "err@不符合流程发起条件,阻止流程发送。";
if (1 == 1)
return "后端外挂 /App/Demo/F065 SendWhen 已经执行成功,节点ID:" + this.HisNode.NodeID + ",WorkID:" + this.WorkID;
// ...
}
全局级还可改 OverrideEvent(消息通道、统一策略等),属于平台定制层,与流程级 FlowEventBase 分层。
| 适合 | 说明 |
|---|---|
| 发送成功写第三方待办、ERP 同步 | SendSuccess 中可取 SendReturnObjs 接受人/到达节点等 |
| 全公司统一审计 | 走全局 Override,而不是每个流程复制粘贴 |
5.4 模式三:事件配置
意图:实施人员在设计器挂 SQL / WebApi / 过程 / 已有事件类 / 业务单元,少写专用 DLL。
| 挂接点配置入口 | 执行体常见类型 |
|---|---|
| 节点事件 / 流程事件 / 表单事件 | SQL、WebApi、存储过程、EventBase、BuessUnitBase 等 |
业务单元基类说明:
/// 1. 重写该类为业务单元子类.
/// 2. 每个业务单元子类可以在流程事件节点时间设置.
/// 3. 被继承的子类的必须在BP.*.DLL 里面,才能确保设置时候被映射到.
/// 4. 子类在DoIt方法中根据WorkID 的书写业务逻辑.
配置侧事件实体:BP.En30/Sys/FrmEvent.cs;管理端事件列表:Vue3/src/WF/Admin/FrmLogic/MapData/FrmEvent/。
也可把可复用逻辑写成 EventBase 子类(如 BP.App/Demo/Event/EventDemo.cs),在配置里按事件源分支处理 SendWhen / SendSuccess / FlowOverAfter 等。
5.5 三种模式如何选型(CCFlow 内部)
| 场景 | 更推荐 | 原因 |
|---|---|---|
| 发送前弹窗校验、字段联动 | 前端外挂 | 反馈即时 |
| 同步 ERP、改接收人、写台账 | 后端外挂 | 强一致、可调试 |
| 一条 SQL / 一个 WebApi | 事件配置 | 实施可配,最快 |
| 全公司统一策略 | 后端全局 Override | 一次拦截全流程 |
同一 SendWhen 需要分层 | 允许叠加 | 前端先拦 → 后端再拦 → 配置再执行 |
5.6 CCFlow 二开相关源码索引
| 主题 | 路径 |
|---|---|
| 前端外挂基类 | Vue3/src/bp/UIEntity/WaiGuaBaseFlow.ts |
| 前端外挂 Demo | Vue3/src/App/Demo/WGFlow_064.ts |
| 办理页调用 | Vue3/src/WF/ToolBar.vue |
| 后端事件基类 | CCFlow/Components/BP.WF/WF/FlowEventBase.cs |
| 后端外挂 Demo | CCFlow/Components/BP.App/Demo/F065.cs |
| 事件执行入口 | CCFlow/Components/BP.WF/WF/ExecEvent.cs |
| 全局拦截 | CCFlow/Components/BP.WF/OverrideEvent.cs |
| 事件配置实体 | CCFlow/Components/BP.En30/Sys/FrmEvent.cs |
| 业务单元 | CCFlow/Components/BP.En30/Sys/BuessUnitBase.cs |
| EventBase Demo | CCFlow/Components/BP.App/Demo/Event/EventDemo.cs |
六、横向对比:同一业务诉求,各引擎怎么挂
以高频诉求「发送前校验 + 发送后同步外部系统」为例:
| 引擎 | 发送前校验(常见做法) | 发送后同步(常见做法) | 备注 |
|---|---|---|---|
| Elsa | 自定义 Activity / 前置逻辑;或阻塞前校验服务 | 后续 Activity 调 Http/消息;或中间件 | 需自己定义「发送」语义 |
| Workflow Core | Step 内校验,失败不 Outcome 到下一步 | 下一 Step 调外部 API;或 Step Middleware | 全代码 |
| WorkflowEngine.NET | Condition / CodeAction / Action 参数校验 | Activity Implementation 中挂 Action | 设计器可配 CodeAction |
| StepWise | Step 方法内抛错/返回失败 | 后续依赖 Step 调用外部系统 | 无审批「发送」概念 |
| CCFlow | 前端 SendWhen 和/或后端 SendWhen 和/或事件配置 | SendSuccess 外挂或 WebApi 事件 | 事件名产品化,可叠加 |
| Slickflow | 节点前 Action / 本地服务校验 | ServiceTask:本地类 / WebApi / SQL | BPMN 节点属性配置 |
再以「自定义一个可复用的流程积木」为例:
| 引擎 | 做法 | 强度 |
|---|---|---|
| Elsa | 官方 Custom Activity + 注册到 Feature | 强 |
| Workflow Core | 新 StepBody + DI 注册 | 强 |
| WorkflowEngine.NET | Custom Activity + 模板 + Plugin | 强 |
| StepWise | 新 [Step] 方法 | 强(但粒度是方法) |
| CCFlow | 更多是挂事件/业务单元/自定义表单页,而非画布新节点类型生态 | 中(审批向) |
| Slickflow | ExternalService / 自定义活动扩展(视版本) | 中偏强 |
七、综合判断(中肯结论)
7.1 不要用一张「总分表」掩盖场景
| 场景 | 二开视角的相对更优选择 | 原因(一句话) |
|---|---|---|
| 微服务/领域编排,自定义活动库 | Elsa(或 Workflow Core 更轻) | Module/Activity 扩展是一等公民 |
| 嵌入现有系统,只要状态机 | Workflow Core | Step + Middleware 足够,负担最小 |
| 要强设计器 + Action/插件,可接受商业许可 | WorkflowEngine.NET | 文档与插件模型成熟 |
| AI/并行任务步骤,不是审批 | StepWise | 代码即工作流 |
| 政企审批,要前端也能挂、实施也能配 | CCFlow | 三模式 + 统一事件时钟 |
| BPMN 嵌入,节点挂 WebApi/本地服务 | Slickflow | ServiceTask 路径清晰 |
7.2 二开机制上的「强项地图」(非营销排名)
| 维度 | 相对突出者 | 公平说明 |
|---|---|---|
| 自定义活动/步骤生态 | Elsa、Workflow Core、WorkflowEngine.NET、StepWise | 编排类产品的看家本领 |
| 设计器内写逻辑 / 插件 | WorkflowEngine.NET | CodeActions + Plugin 完整 |
| 审批事件产品化 + 前后端同协议 | CCFlow | 三模式是产品设计,不是事后补丁 |
| 节点多种执行体(类/Api/SQL/过程) | CCFlow、Slickflow、WorkflowEngine.NET | BPM/商业引擎常见能力 |
| 纯开发者最少概念 | Workflow Core、StepWise | 代价是产品面薄 |
7.3 对 CCFlow 的公正边界
做得好的:把「流程二开」定义清楚,并用前端外挂、后端外挂、事件配置三条路径落地;事件与消息共用时钟但职责分离;本仓库有可运行 Demo(WGFlow_064、F065、EventDemo)。
需要承认的:若目标是「像 Elsa 一样沉淀跨项目的自定义 Activity NuGet 生态」,CCFlow 不是同一叙事;它赢在审批生命周期上的业务挂接与低代码配置,而不是通用编排积木市场。
7.4 选型前建议自问的三句话
- 我的「流程」是 审批待办,还是 服务编排/任务图?
- 二开主力是 前端、后端,还是实施配置?
- 能否接受 商业许可 或 自建表单/组织/移动?
答完这三句,六款产品的二开对比基本就不会选错赛道。
八、资料来源(便于复核)
| 产品 | 主要公开来源 |
|---|---|
| Elsa | Custom Activities、Plugins & Modules、Human-in-the-loop 模式 |
| Workflow Core | Getting started、Middleware、GitHub |
| WorkflowEngine.NET | Actions、Plugins、Custom Activity |
| StepWise | GitHub、官方文档站 |
| Slickflow | ServiceTask 二开示例、API 说明 |
| CCFlow | 本仓库 BP.WF / BP.App / BP.En30 / Vue3;内部文档《流程二开的三种模式》《流程事件》 |
附录:与「改引擎」相关的红线(通用建议)
| 建议 | 说明 |
|---|---|
| 业务逻辑优先走扩展点 | 事件 / Action / Step / Activity / 外挂 |
| 避免直接改发送内核 | 升级与补丁成本会指数上升 |
| 扩展代码独立程序集/目录 | 便于 CI 与多项目复用 |
| 前端拦截不能代替服务端校验 | 安全与一致性以服务端事件为准 |
文档定位:二开机制对比与选型辅助,不是性能测试报告,也不是商务招标评分表。具体 API 以各产品当期文档与源码为准。

329

被折叠的 条评论
为什么被折叠?



