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"); // 活动出参
          }
      });
### 如何在 C# WinForms 应用程序中使用 WorkflowCore 为了在 C# WinForms 应用程序中集成并使用 WorkflowCore,可以遵循以下方法: #### 安装 WorkflowCore NuGet 包 首先,在 Visual Studio 中打开项目的包管理器控制台,并运行命令来安装 `WorkflowCore` 和其他必要的依赖项。 ```powershell Install-Package WorkflowCore ``` 这一步骤确保了所有必需的库都已准备好用于工作流的设计和执行[^1]。 #### 初始化 WorkflowHost 接着,在应用程序启动位置(通常是 `Program.cs` 或者主窗体的构造函数内),初始化 `WorkflowHost` 并配置持久化存储和其他选项。 ```csharp using System; using WorkflowCore.Interface; using WorkflowCore.Services; class Program { static IWorkflowHost _host; [STAThread] static void Main() { var hostBuilder = WorkflowHost.Builder(); // 配置内存中的持久化层或其他类型的数据库支持 hostBuilder.UseSqlServer("YourConnectionString", "TableNamePrefix"); // 启动主机实例 _host = hostBuilder.Build(); _host.Start(); Application.Run(new MainForm()); // 关闭时停止服务 _host.Stop(); } } ``` 这段代码展示了如何设置一个基于 SQL Server 的持久化机制;也可以选择不同的数据提供者如 MongoDB、PostgreSQL 等取决于具体需求[^2]。 #### 创建自定义的工作单元 通过继承 `StepBody` 类来自定义业务逻辑步骤。这些类代表了工作流程图上的节点行为。 ```csharp public class MyCustomStep : StepBody { protected override ExecutionResult Run(IStepExecutionContext context) { Console.WriteLine("Executing custom step..."); return ExecutionResult.Next(); // 继续下一个步骤 } } ``` 这里定义了一个简单的动作作为例子,实际应用中应替换为具体的处理逻辑[^3]。 #### 设计与注册工作流定义 最后,设计好整个工作流结构之后就可以将其注册到宿主环境中去了。通常是在应用程序加载初期完成这项操作。 ```cshellsession _host.RegisterWorkflow<MyWorkflow>(workflow => { workflow.Name = "My First WF"; workflow.StartWith<MyCustomStep>(); }); ``` 上述片段说明了怎样把之前创建好的组件组合起来形成完整的自动化过程描述[^4]。 #### 调用工作流 当 UI 层触发某个事件时,可以通过调用 `_host.StartWorkflowAsync()` 方法来启动指定名称的工作流实例。 ```csharp private async void btnStartWF_Click(object sender, EventArgs e) { await _host.StartWorkflowAsync("My First WF"); } ``` 这样就完成了从界面交互到后台任务调度之间的桥梁搭建[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值