能否使用C#替代XAML编写Windows Workflow Foundation工作流?
用纯C#定义Windows Workflow Foundation工作流(附WCF托管示例)
当然可以用纯C#来定义Windows Workflow Foundation(WF)工作流!这恰好能解决你提到的XAMLX文件那些头疼问题——比如文件莫名损坏、可读性差没法并行开发、变更合并困难这些痛点。用C#代码定义工作流的话,完全能把工作流逻辑当成普通业务代码来维护,版本控制、代码审查这些流程都能无缝衔接,和MSDN提到的方案完全匹配。
纯C#工作流示例
先给你一个简单的顺序工作流示例,包含自定义活动和基础WF活动的组合:
using System; using System.Activities; using System.Activities.Statements; namespace WfCSharpDemo { // 自定义活动:打印指定消息 public class PrintMessageActivity : CodeActivity { // 定义输入参数 public InArgument<string> Message { get; set; } protected override void Execute(CodeActivityContext context) { string message = context.GetValue(Message); Console.WriteLine($"工作流执行:{message}"); } } // 用C#定义完整工作流 public class SampleWorkflow : Activity { protected override Func<Activity> Implementation { get { return () => new Sequence { Activities = { new PrintMessageActivity { Message = "开始执行工作流" }, // 添加延迟步骤 new Delay { Duration = TimeSpan.FromSeconds(2) }, new PrintMessageActivity { Message = "完成延迟步骤" }, // 条件判断分支 new If { Condition = new InArgument<bool>(true), Then = new PrintMessageActivity { Message = "条件判断为真" }, Else = new PrintMessageActivity { Message = "条件判断为假" } } } }; } } } }
执行工作流的测试代码
要运行上面的工作流,只需要在控制台程序里添加这段执行逻辑:
using System; using System.Activities; namespace WfCSharpDemo { class Program { static void Main(string[] args) { var workflow = new SampleWorkflow(); var invoker = new WorkflowInvoker(workflow); Console.WriteLine("启动工作流..."); invoker.Invoke(); Console.WriteLine("工作流执行完毕"); Console.ReadLine(); } } }
WCF托管工作流的配置示例
如果需要把工作流通过WCF对外提供服务,这里给你一套完整的配置和实现代码:
1. 定义WCF服务契约
using System.ServiceModel; using System.ServiceModel.Activities; namespace WfWcfHost { [ServiceContract] public interface IWorkflowService { [OperationContract] void StartSampleWorkflow(); } }
2. 实现服务并关联C#工作流
using System.Activities; using System.ServiceModel.Activities; namespace WfWcfHost { public class WorkflowServiceImplementation : IWorkflowService { public void StartSampleWorkflow() { // 直接调用我们之前定义的C#工作流 var workflow = new SampleWorkflow(); var invoker = new WorkflowInvoker(workflow); invoker.Invoke(); } } // 也可以直接用WorkflowServiceHost托管工作流 public static class WorkflowHostHelper { public static void HostWorkflowService() { // 将C#工作流包装为WCF服务 var service = new WorkflowService { Name = "SampleWorkflowService", Body = new SampleWorkflow() }; using (var host = new WorkflowServiceHost(service, new Uri("http://localhost:8080/SampleWorkflow"))) { // 添加基础HTTP绑定的终结点 host.AddServiceEndpoint(typeof(IWorkflowService), new BasicHttpBinding(), ""); // 启用元数据发布,方便客户端生成代理 var smb = new ServiceMetadataBehavior { HttpGetEnabled = true }; host.Description.Behaviors.Add(smb); host.Open(); Console.WriteLine("WCF工作流服务已启动,按任意键停止..."); Console.ReadLine(); host.Close(); } } } }
3. 启动WCF托管服务
在控制台程序的Main方法里调用托管逻辑即可:
static void Main(string[] args) { WorkflowHostHelper.HostWorkflowService(); }
额外小贴士
- 纯C#定义的工作流和XAML版本功能完全等价,所有WF内置活动、自定义活动都能用代码组合。
- 这种方式更适合单元测试,你可以直接在测试项目中实例化工作流,传入测试参数验证逻辑。
- 复杂工作流可以拆分成多个独立的活动类,和普通C#项目的分层思想一致,维护起来更轻松。
内容的提问来源于stack exchange,提问作者Ivan Koshelev
相关产品推荐
相关产品推荐

