C#如何实现工作流引擎?附完整项目实例与源码

来源:网站主作者:广州网站建设头衔:草根站长
导读:本期聚焦于小伙伴创作的《C#如何实现工作流引擎?附完整项目实例与源码》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#如何实现工作流引擎?附完整项目实例与源码》有用,将其分享出去将是对创作者最好的鼓励。

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

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放在程序运行目录下,执行后可以看到流程从提交申请节点依次流转到部门审批、人事备案,最后到达结束节点的完整过程。

扩展说明

以上实例是基础的工作流引擎实现,实际项目中可以根据需求扩展更多功能:

  • 添加条件网关节点,支持根据流程变量判断流转分支
  • 增加节点处理人规则配置,支持按角色、部门、动态指定处理人
  • 添加流程实例持久化功能,将流程状态存储到数据库中
  • 支持流程的挂起、恢复、撤销等操作

开发者可以根据自身业务需求对以上基础代码进行修改和扩展,快速搭建符合项目要求的工作流引擎。

C#工作流引擎流程定义状态机活动节点修改时间:2026-07-21 12:15:39

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。