You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:07:47