Mldong.Jeeflow.Core 1.0.2

dotnet add package Mldong.Jeeflow.Core --version 1.0.2
                    
NuGet\Install-Package Mldong.Jeeflow.Core -Version 1.0.2
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Mldong.Jeeflow.Core" Version="1.0.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Mldong.Jeeflow.Core" Version="1.0.2" />
                    
Directory.Packages.props
<PackageReference Include="Mldong.Jeeflow.Core" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Mldong.Jeeflow.Core --version 1.0.2
                    
#r "nuget: Mldong.Jeeflow.Core, 1.0.2"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Mldong.Jeeflow.Core@1.0.2
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Mldong.Jeeflow.Core&version=1.0.2
                    
Install as a Cake Addin
#tool nuget:?package=Mldong.Jeeflow.Core&version=1.0.2
                    
Install as a Cake Tool

<div align="center">

jeeflow-csharp

jeeflow 工作流引擎的 C#/.NET 实现——多语言联邦第 8 语言

NuGet NuGet .NET release T0 License

</div>

jeeflow 引擎规范的 C#/.NET 语言实现(多语言联邦,与 Java/Go/Python/Node/PHP/Rust/MoonBit 共享同一套 LogicFlow 流程 JSON 与契约规范)。 引擎核心零第三方依赖;MySQL 仓储走 MySqlConnector;持久化仅用 BCL System.Data.Common全链 async

统一门面入口 + 可插拔仓储 + 动态业务表入库;串行/并行/按比例会签与一票否决(ONE_VOTE_VETO) 语义对齐联邦契约(以 jeeflow-java 参考实现为准)。

flowchart LR
  ui["jeeflow-ui (?lang=csharp)"] -->|"/csharp-api → POST /wf/{action}"| demo["demo :8093<br/>minimal API"]
  demo --> f["**Facade** FlowAsync(action, args)<br/>45 actions · 契约出口层"]
  f --> e["**Engine** (全 async)<br/>start · execute · jump · 会签门控"]
  e -->|SPI| repo["IProcessRepository"]
  repo --> mem["MemoryRepository<br/>(T0 / 内嵌使用)"]
  repo --> my[("MySqlRepository<br/>MySqlConnector · m_ 过滤 · 分页五键")]
  f --> p["**Persist**<br/>ARCHIVE / SYNC · 字段权限"]

包矩阵

NuGet 依赖 说明
Mldong.Jeeflow.Core NuGet 零第三方 模型/SPI/引擎/parser/handler/event/枚举字典/内存仓储/雪花 id/出口 stringifier
Mldong.Jeeflow.Repository.MySql NuGet Core、MySqlConnector MySQL 仓储(全 async)、环境事务(AsyncLocal)、白名单分页/排序、建表 SQL 随包
Mldong.Jeeflow.Persist NuGet Core 业务数据动态入库:DynamicTableWriter + ARCHIVE/SYNC 双模式 + 字段权限
Mldong.Jeeflow.Facade NuGet Core、Persist FlowAsync(action, args) 45 action 统一门面 + {code,msg,data} 契约出口层

类库目标 net8.0;net10.0 双 TFM;demo/test 为 net10.0(不发布)。

快速开始

dotnet add package Mldong.Jeeflow.Facade    # 引入门面(传递 Core + Persist)
dotnet add package Mldong.Jeeflow.Repository.MySql   # 生产 MySQL 仓储(可选:内嵌场景用内存仓储即可)

内存仓储(内嵌 / 测试)

using Mldong.Jeeflow.Core;

var repo = new MemoryRepository();
var ctx  = new ServiceContext(repo);
ctx.UserProvider = new MyUserProvider();          // IUserProvider:按 id 取用户

var engine = new JeeflowEngine(ctx);

// 部署流程(LogicFlow JSON)并发起
var content = File.ReadAllText("leave.json");
var define = new ProcessDefine { Name = "leave", DisplayName = "请假", Type = "approval",
                                 State = 1, Version = 1,
                                 Content = Encoding.UTF8.GetBytes(content) };
await repo.SaveDefineAsync(define);

var inst = await engine.StartProcessInstanceByIdAsync(define.Id, "user1",
    new FlowData { ["f_days"] = 3, ["f_reason"] = "年假" });

MySQL 仓储(生产)

using Mldong.Jeeflow.Repository.MySql;

var factory = MySqlConnectionFactory.FromEnv();   // 读 JEFFLOW_DB_HOST/PORT/USER/PWD/NAME(JEEFLOW_DB_* 别名兼容)
// 或显式: new MySqlConnectionFactory("192.168.1.160", 3306, "root", pwd, "jeeflow");
var repo = new MySqlRepository(factory);
var ctx  = new ServiceContext(repo);
repo.Configure(ctx);                              // 两阶段接线(ctx ↔ repo 解循环)
ctx.TransactionTemplate = new MySqlTransactionTemplate(factory, repo);  // 可选真事务
  • 语句级 autocommit 为联邦现状;注入 ITransactionTemplate 后同事务内所有仓储方法共用同一连接/事务。
  • 建表 SQL 随包:schema/schema-mysql.sql(5 张 wf_* 表,无自增,主键应用层雪花生成)。

统一门面(45 action)

using Mldong.Jeeflow.Facade;

var facade = new JeeflowFacade(ctx);
var json = await facade.FlowJsonAsync("processInstance/startAndExecute", new FlowData
{
    ["processDefineId"] = "1",
    ["operator"] = "user1",
    ["f_days"] = 3,
});
// 恒 {code,msg,data} 信封;成功 code=0;业务失败只发明 99999999

集成方只需一个转发 controller:HTTP body JSON → FlowDataFlowAsync(action, args)

Demo 演示站(:8093)

dotnet run --project demo/Mldong.Jeeflow.Demo      # 双存储(默认内存;JEEFLOW_DEMO_STORE=mysql 连库)
bash demo/smoke_test.sh                            # T2 冒烟 20/20
  • 路由:/wf/{action} catch-all + /health + /stats + /reset;CORS 全开,直连 jeeflow-ui(前端 ?lang=csharp,vite 代理 /csharp-api → :8093)。
  • 种子流程与 java/go/python/node/php/rust/moon 七语言仓共享同一批 LogicFlow JSON(flows/ 目录,随联邦漂移门禁逐字 diff)。

契约速览

  • 信封:恒 {code,msg,data};成功 code=0;失败只发明 99999999;未知 action 同码。
  • 出口:id 全字符串化(递归含复数数组——雪花 id 超 float64 安全整数)、时间 yyyy-MM-dd HH:mm:ss、分页恒五键(pageNum/pageSize/recordCount/totalPage/rows)、统计计数 int 出参(issues/105)。
  • 入口:id string/number 双收、批量 {ids} 与单 {id} 双收(ids 优先)、m_ 三段式查询过滤。
  • 会签:串行逐个推进(operatorList_*/loopCounter_*/nrOfInstances_* 任务变量)、并行全量/表达式门控(#nrOfCompletedInstances)、ONE_VOTE_VETO 一票否决、merged 后废弃残留 DOING、软拒绝 submitType=20
  • 事件TASK_START 落库后 fire(sourceId=taskId 可反查)、CC_CREATE 逐抄送人直传事件体、终态两路 INSTANCE_END、逐监听器隔离。
  • 并发:引擎命令级 SemaphoreSlim 串行化——同一任务并发办理恰一次成功。

测试

覆盖 运行
T0 内存仓储 153 用例(契约 C1–C29 + CS 增补 + 负向变异) dotnet test tests/Mldong.Jeeflow.Tests
T1 MySQL 真库(分页/hydrate/事务回滚/并发恰一次/ARCHIVE/SYNC 字段权限/自清理) JEFFLOW_DB_PWD=... dotnet test --filter "Category=mysql-smoke"
T2 demo 冒烟 20 项 bash demo/smoke_test.sh
一致性 stats 15 key 与七语言逐字段一致 dotnet run --project demo/Mldong.Jeeflow.Consistency
  • MySQL 凭据只走 JEFFLOW_DB_* env,不入仓;开发机 SKIP_MYSQL=1 跳过 T1。
  • 全链 async 门禁:grep -rnE "\.Result|\.Wait\(\)|GetAwaiter\(\)\.GetResult\(\)" src/ 必须为空。

文档

文档 内容
docs/getting-started.md 安装 + 5 分钟上手
docs/engine-api.md 引擎五方法 + 聚合根行为
docs/flow-definition.md 流程 JSON 定义规范
docs/spi-guide.md SPI 实现指南(IUserProvider/表达式/handler)
docs/persist.md 业务数据动态入库(ARCHIVE/SYNC/字段权限)
docs/demo.md demo 站 + jeeflow-ui 联调
docs/contract-notes.md 契约细节与已知差异注记
docs/action-manifest.json 45 action 三方对账(java↔moon↔csharp)
docs/testing.md T0/T1/T2 测试说明
docs/PUBLISH.md 发版执行清单(Trusted Publishing)

发版

tag 驱动全自动:git tag v1.0.x && git push → GitHub Actions(Trusted Publishing,OIDC 免 API key) → pack 四包 → 按依赖拓扑序 push NuGet。版本号取自 tag(v1.0.1 → 1.0.1),仓库内不存任何密钥。

相关仓库

java(参考实现)· go · python · node · php · rust · moon · ui · 文档站

License

Apache-2.0

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net10.0

    • No dependencies.
  • net8.0

    • No dependencies.

NuGet packages (3)

Showing the top 3 NuGet packages that depend on Mldong.Jeeflow.Core:

Package Downloads
Mldong.Jeeflow.Repository.MySql

jeeflow 工作流引擎 C#/.NET 实现(第 8 语言)

Mldong.Jeeflow.Persist

jeeflow 工作流引擎 C#/.NET 实现(第 8 语言)

Mldong.Jeeflow.Facade

jeeflow 工作流引擎 C#/.NET 实现(第 8 语言)

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.2 104 9/7/2026
1.0.1 104 9/6/2026
1.0.0 112 9/6/2026