工作流引擎是处理业务流程自动化流转的核心组件,在C#中实现工作流引擎需要围绕流程定义、节点管理、状态流转三个核心部分展开,下面结合实际项目实例说明具体实现方式。

核心模块设计
流程定义模块
流程定义模块负责描述整个业务流程的结构,包括流程包含的活动节点、节点之间的流转规则、每个节点的处理人配置等信息。我们可以使用JSON格式存储流程定义,方便序列化和反序列化操作。
流程定义的基础结构如下:
{
"FlowId": "leave_approval_flow",
"FlowName": "请假审批流程",
"Activities": [
{
"ActivityId": "submit",
"ActivityName": "提交请假申请",
"ActivityType": "UserTask",
"NextActivities": ["dept_approval"]
},
{
"ActivityId": "dept_approval",
"ActivityName": "部门经理审批",
"ActivityType": "UserTask",
"NextActivities": ["hr_record", "reject_end"]
},
{
"ActivityId": "hr_record",
"ActivityName": "人事备案",
"ActivityType": "UserTask",
"NextActivities": ["end"]
},
{
"ActivityId": "reject_end",
"ActivityName": "驳回结束",
"ActivityType": "End"
},
{
"ActivityId": "end",
"ActivityName": "流程结束",
"ActivityType": "End"
}
]
}
活动节点模块
活动节点是流程中的最小执行单元,不同类型的节点对应不同的处理逻辑,常见的节点类型包括用户任务节点、网关节点、结束节点等。我们可以定义一个基础的活动节点抽象类,不同节点类型继承该抽象类实现各自的逻辑。
using System;
using System.Collections.Generic;
namespace WorkflowEngine.Core
{
// 活动节点抽象基类
public abstract class Activity
{
// 节点唯一标识
public string ActivityId { get; set; }
// 节点名称
public string ActivityName { get; set; }
// 节点类型
public string ActivityType { get; set; }
// 后续节点ID列表
public List<string> NextActivities { get; set; }
// 执行节点逻辑
public abstract void Execute(WorkflowContext context);
}
// 用户任务节点
public class UserTaskActivity : Activity
{
public override void Execute(WorkflowContext context)
{
Console.WriteLine($"执行用户任务节点:{ActivityName},节点ID:{ActivityId}");
// 这里可以添加任务分配、状态更新等业务逻辑
context.CurrentActivityId = ActivityId;
}
}
// 结束节点
public class EndActivity : Activity
{
public override void Execute(WorkflowContext context)
{
Console.WriteLine($"流程到达结束节点:{ActivityName}");
context.IsFlowFinished = true;
}
}
}
流程上下文与状态流转模块
流程上下文用于存储当前流程实例的运行状态,包括当前所处的节点、流程是否结束、流程变量等信息。状态流转模块根据流程定义和当前上下文,驱动流程从一个节点流转到下一个节点。
using System;
using System.Collections.Generic;
namespace WorkflowEngine.Core
{
// 流程上下文
public class WorkflowContext
{
// 流程实例ID
public string InstanceId { get; set; }
// 当前所处节点ID
public string CurrentActivityId { get; set; }
// 流程是否结束
public bool IsFlowFinished { get; set; }
// 流程变量
public Dictionary<string, object> Variables { get; set; } = new Dictionary<string, object>();
}
// 工作流引擎核心类
public class WorkflowEngine
{
// 存储所有活动节点的字典,key为节点ID
private Dictionary<string, Activity> _activities = new Dictionary<string, Activity>();
// 加载流程定义
public void LoadFlowDefinition(FlowDefinition definition)
{
foreach (var activityDef in definition.Activities)
{
Activity activity = null;
switch (activityDef.ActivityType)
{
case "UserTask":
activity = new UserTaskActivity();
break;
case "End":
activity = new EndActivity();
break;
// 可扩展其他节点类型
}
if (activity != null)
{
activity.ActivityId = activityDef.ActivityId;
activity.ActivityName = activityDef.ActivityName;
activity.ActivityType = activityDef.ActivityType;
activity.NextActivities = activityDef.NextActivities;
_activities.Add(activity.ActivityId, activity);
}
}
}
// 启动流程
public WorkflowContext StartFlow(string instanceId, string startActivityId)
{
WorkflowContext context = new WorkflowContext
{
InstanceId = instanceId,
CurrentActivityId = startActivityId,
IsFlowFinished = false
};
ExecuteActivity(context);
return context;
}
// 执行当前节点并流转到下一个节点
public void ExecuteActivity(WorkflowContext context)
{
if (context.IsFlowFinished)
{
return;
}
if (_activities.ContainsKey(context.CurrentActivityId))
{
Activity currentActivity = _activities[context.CurrentActivityId];
currentActivity.Execute(context);
// 简单流转逻辑:取第一个后续节点执行,实际项目可根据条件判断
if (!context.IsFlowFinished && currentActivity.NextActivities.Count > 0)
{
context.CurrentActivityId = currentActivity.NextActivities[0];
ExecuteActivity(context);
}
}
}
}
// 流程定义类
public class FlowDefinition
{
public string FlowId { get; set; }
public string FlowName { get; set; }
public List<ActivityDefinition> Activities { get; set; }
}
// 活动定义类,用于反序列化流程定义JSON
public class ActivityDefinition
{
public string ActivityId { get; set; }
public string ActivityName { get; set; }
public string ActivityType { get; set; }
public List<string> NextActivities { get; set; }
}
}
完整项目实例运行
下面是一个控制台程序调用工作流引擎的实例,模拟请假审批流程的运行过程:
using System;
using System.IO;
using Newtonsoft.Json;
using WorkflowEngine.Core;
namespace WorkflowEngine.Demo
{
class Program
{
static void Main(string[] args)
{
// 读取流程定义JSON文件
string jsonPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "leave_approval_flow.json");
string jsonContent = File.ReadAllText(jsonPath);
FlowDefinition flowDefinition = JsonConvert.DeserializeObject<FlowDefinition>(jsonContent);
// 初始化工作流引擎
WorkflowEngine engine = new WorkflowEngine();
engine.LoadFlowDefinition(flowDefinition);
// 启动流程实例
Console.WriteLine("启动请假审批流程实例");
WorkflowContext context = engine.StartFlow(Guid.NewGuid().ToString(), "submit");
Console.WriteLine($"流程实例ID:{context.InstanceId}");
Console.WriteLine($"流程是否结束:{context.IsFlowFinished}");
}
}
}
运行以上代码前需要安装Newtonsoft.Json包用于JSON反序列化,将之前定义的流程JSON保存为leave_approval_flow.json放在程序运行目录下,执行后可以看到流程从提交申请节点依次流转到部门审批、人事备案,最后到达结束节点的完整过程。
扩展说明
以上实例是基础的工作流引擎实现,实际项目中可以根据需求扩展更多功能:
- 添加条件网关节点,支持根据流程变量判断流转分支
- 增加节点处理人规则配置,支持按角色、部门、动态指定处理人
- 添加流程实例持久化功能,将流程状态存储到数据库中
- 支持流程的挂起、恢复、撤销等操作
开发者可以根据自身业务需求对以上基础代码进行修改和扩展,快速搭建符合项目要求的工作流引擎。