WorkflowCore

WorkflowCore

一、快速开始

1、添加类库

<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="9.0.0" />
<PackageReference Include="WorkflowCore" Version="3.11.0" />
<!--(可选)-->
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" /> 

2、添加Workflow

var services = new ServiceCollection();

services.AddLogging(c =>
{
   c.SetMinimumLevel(LogLevel.Debug);
   c.AddDebug();
});

services.AddWorkflow();

var sp = services.BuildServiceProvider();

Ioc.Default.ConfigureServices(sp); // (可选)

3、注册工作流

var host = sp.GetRequiredService<IWorkflowHost>();
host.RegisterWorkflow<HelloworldWorkflow, HelloParam>();

host.OnLifeCycleEvent += Host_OnLifeCycleEvent;

# 启动
host.Start();
# 停止
// host.Stop();

private void Host_OnLifeCycleEvent(LifeCycleEvent evt)
{
	// 注意 Dispose 工作流
}

4、定义工作流

internal class HelloworldWorkflow : IWorkflow<HelloParam>
{
	public string Id => "HelloworldWorkflow";
	
	public int Version => 1;
	
	public void Build(IWorkflowBuilder<HelloParam> builder)
	{
	    builder
	        .StartWith<HelloStepBody>()
	        .Then<WorldStepBodyAsync >();
	}
}

5、定义步骤

  • 同步
internal class HelloStepBody : StepBody
{
    public override ExecutionResult Run(IStepExecutionContext context)
    {
        Debug.WriteLine("Hello");
        return ExecutionResult.Next();
    }
}
  • 异步
internal class WorldStepBodyAsync : StepBodyAsync
{
    public override async Task<ExecutionResult> RunAsync(IStepExecutionContext context)
    {
        Debug.WriteLine("World!");
        await Task.Delay(10);
        return ExecutionResult.Next();
    }
}

6、执行工作流

using var scope = Ioc.Default.CreateScope();
var host = scope.ServiceProvider.GetRequiredService<IWorkflowHost>();
host.StartWorkflow<HelloParam>("HelloworldWorkflow", new HelloParam { });

二、WorkflowController 工作流控制器

# 启动工作流
Task<string> StartWorkflow(...);

# 发布事件
Task PublishEvent(string eventName, string eventKey, object eventData, DateTime? effectiveDate = null);

# 注册工作流
void RegisterWorkflow<TWorkflow>()
void RegisterWorkflow<TWorkflow, TData>()

# 暂停工作流,直到调用 ResumeWorkflow
Task<bool> SuspendWorkflow(string workflowId);

# 恢复工作流
Task<bool> ResumeWorkflow(string workflowId);

# 终止工作流
Task<bool> TerminateWorkflow(string workflowId);

三、ActivityController 活动控制器

  • PendingActivity 类
# [学习] 源码生成的Token字符串的方法
public string Token { get; set; }
public string ActivityName { get; set; }
public object Parameters { get; set; }
# 使用 GetPendingActivity 返回时,默认为DateTime.MaxValue
public DateTime TokenExpiry { get; set; }
  • IActivityController 接口
# 获取待处理的活动
Task<PendingActivity> GetPendingActivity(string activityName, string workerId, TimeSpan? timeout = null);
# 释放活动
Task ReleaseActivityToken(string token);
# 提交成功的结果
Task SubmitActivitySuccess(string token, object result);
# 提交失败的结果
Task SubmitActivityFailure(string token, object result);

一个活动的Step by Step

builder
    .StartWith<HelloStepBody>()
	# Step2. 等待活动
    .Activity("activity1",(data)=>data.Param1)  // 入参
        .Output(data=>data.Param1, step=>step.Result)  // 出参
    # Step5. 活动结果后继续执行   
    .Then<WorldStepBody>();
using var scope = Ioc.Default.CreateScope();
var host = scope.ServiceProvider.GetRequiredService<IWorkflowHost>();
# Step1. 启动工作流
var workflowId = await host.StartWorkflow<HelloParam>("HelloworldWorkflow", new HelloParam { });

await Task.Run(async () =>
      {
          await Task.Delay(3000);
          # Step3. 获取活动
          var activity = await host.GetPendingActivity("activity1", workflowId);

          if (activity != null)
          {
              Debug.WriteLine("Parameters: " + activity.Parameters);  // 活动入参
              # Step4. 提交活动结果
              await host.SubmitActivitySuccess(activity.Token, "World"); // 活动出参
          }
      });
WorkflowCore 是一个轻量级的工作流引擎,专为 .NET 开发者设计,用于在应用程序中集成和执行业务流程自动化。它提供了一种声明式的方式来定义复杂的工作流逻辑,并支持顺序、并行、条件分支等多种流程结构。WorkflowCore 的核心功能包括创建工作流定义、启动和管理流程实例、跟踪流程状态、处理事件以及支持持久化存储,以便在应用程序重启后仍能保持流程状态 [^1]。 ### 功能特点 - **流程定义**:使用代码或 JSON 文件定义工作流,支持多种流程结构,如顺序步骤、并行分支、条件判断等。 - **流程实例管理**:支持启动、暂停、恢复和终止流程实例。 - **事件驱动**:可以监听外部事件并触发流程的继续执行,适用于人工审批、异步任务处理等场景。 - **持久化支持**:通过插件可以将流程状态存储到数据库中,确保系统的高可用性和可伸缩性。 - **扩展性**:支持自定义步骤、插件和事件总线,便于集成到现有系统中。 ### 使用场景 WorkflowCore 可广泛应用于需要流程自动化的业务场景,例如: - **审批流程**:实现多级审批机制,如报销审批、合同审批等。在 ASP.NET Core 项目中,可以通过定义输入输出参数来传递审批内容,例如发送邮件通知 [^4]。 - **订单处理**:自动化订单状态流转,包括支付确认、库存扣减、物流调度等步骤。 - **任务调度**:在任务管理系统中协调多个任务的执行顺序和依赖关系。 - **数据处理流程**:在数据管道中串联多个数据处理步骤,如数据清洗、转换和加载(ETL)。 ### 教程与学习资源 对于初学者,可以从基础的安装和配置开始学习,例如通过 NuGet 安装 WorkflowCore 并配置持久化存储。随着对框架的熟悉,可以进一步探索高级特性,如自定义步骤、事件处理、并行执行等。官方文档和 GitHub 仓库的 Readme 文件是获取最新信息和技术细节的重要来源 [^2]。 ### 示例代码 以下是一个简单的工作流定义示例,展示了如何使用 WorkflowCore 定义一个顺序流程: ```csharp public class MyWorkflow : IWorkflow { public string Id => "MyWorkflow"; public int Version => 1; public void Build(IWorkflowBuilder<object> builder) { builder .StartWith<HelloWorldStep>() .Then<GoodbyeWorldStep>(); } } public class HelloWorldStep : StepBody { public override ExecutionResult Run(IStepExecutionContext context) { Console.WriteLine("Hello, World!"); return ExecutionResult.Next(); } } public class GoodbyeWorldStep : StepBody { public override ExecutionResult Run(IStepExecutionContext context) { Console.WriteLine("Goodbye, World!"); return ExecutionResult.Next(); } } ``` 在上述代码中,`MyWorkflow` 定义了一个包含两个步骤的工作流,依次执行 `HelloWorldStep` 和 `GoodbyeWorldStep`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值