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#)