Microsoft Agent Framework是微软提供的一套用于构建智能代理和工作流系统的开发框架,而C#作为.NET平台的主力语言,自然成为与之配合的最佳选择。在实际开发中,Workflows(工作流)的设计模式直接决定了系统的灵活性、可维护性和扩展性。今天我们就来深入探讨Workflows的几种典型模式及其适用场景。
作为一名长期使用这套技术栈的开发者,我发现很多团队在Workflow模式选择上存在困惑。不同的业务场景需要匹配不同的Workflow模式,选错了可能会导致后期维护成本指数级增长。本文将基于实际项目经验,解析Sequential(顺序)、State Machine(状态机)和Rules-Driven(规则驱动)这三种主流模式的特点与实现。
顺序工作流是最直观的模式,适合线性业务流程。在C#中通过System.Workflow.Activities命名空间下的SequenceActivity类实现:
csharp复制WorkflowInstance instance = workflowRuntime.CreateWorkflow(
typeof(SequentialWorkflowSample));
instance.Start();
典型应用场景包括:
注意:虽然实现简单,但实际项目中建议为每个Activity添加异常处理块。我曾遇到过因为某个环节崩溃导致整个流程卡死的生产事故。
当业务逻辑存在复杂状态转换时,状态机模式更为合适。通过StateMachineWorkflowActivity类定义状态和迁移:
csharp复制public class OrderStateMachine : StateMachineWorkflowActivity
{
public State Created;
public State Paid;
public State Shipped;
// 状态迁移定义
public EventDrivenActivity PaymentReceived;
}
状态机的优势体现在:
在电商系统中,我常用状态机处理订单生命周期。一个经验是:当状态超过5个时,建议用StateFinalizationActivity清理资源,避免内存泄漏。
对于需要频繁调整业务规则的场景,RulesEngineWorkflow是更好的选择。其核心是将业务逻辑与流程控制解耦:
xml复制<RuleDefinitions>
<RuleExpressionCondition Name="IsHighValue">
<RuleExpression>
this.OrderTotal > 10000
</RuleExpression>
</RuleExpressionCondition>
</RuleDefinitions>
这种模式特别适合:
在银行项目中,我们通过RuleSet动态调整风控阈值,无需重新部署整个工作流。
| 维度 | 顺序工作流 | 状态机工作流 | 规则驱动工作流 |
|---|---|---|---|
| 开发复杂度 | ★★☆ | ★★★★ | ★★★☆ |
| 维护成本 | ★★☆ | ★★★☆ | ★★☆☆ |
| 灵活性 | ★☆☆ | ★★★☆ | ★★★★ |
| 可视化调试 | ★★★☆ | ★★★★ | ★★☆☆ |
| 适合场景 | 线性流程 | 复杂状态转换 | 动态规则 |
在吞吐量要求高的场景(如电信计费系统),需要特别注意:
实测数据(基于WF 4.5):
标准Activity可能无法满足特殊需求,这时需要自定义:
csharp复制public class FraudCheckActivity : NativeActivity
{
public InArgument<Order> CurrentOrder { get; set; }
protected override void Execute(NativeActivityContext context)
{
var order = CurrentOrder.Get(context);
// 自定义反欺诈逻辑
}
}
关键点:
长时间运行的工作流需要持久化:
csharp复制var store = new SqlWorkflowInstanceStore(connectionString);
store.InstanceCompletionAction = InstanceCompletionAction.DeleteAll;
workflowRuntime.InstanceStore = store;
配置要点:
症状:工作流卡在某个状态无法推进
排查步骤:
可能原因:
优化方案:
xml复制<behavior>
<workflowIdle timeToUnload="00:00:05"/>
<etwTracking profileName="HealthMonitoring"/>
</behavior>
工作流定义更新后,处理运行中实例的方案:
虽然经典Workflow Foundation仍然可用,但新项目可以考虑:
迁移注意事项:
在容器化环境中,我推荐采用Durable Functions+Azure Storage的组合,既保留了工作流特性,又具备更好的弹性伸缩能力。