首先感谢作者能写出如此优雅的作品,作品地址:Workflow-Core
由于工作需要,需要在项目中添加工作流引擎,经过产品经理的选型,决定用这个,并且将这个任务分配给我。经过几天的研究,我在这边做一点简单的介绍,给将要使用的同仁做一点参考。详细的可以参考项目的 wiki 文档,不过都是英文的。
在我理解工作流是对某一个具体任务和任务之间业务规则的抽象,他将任务拆分为若干步骤,然后将这些步骤串起来,协同完成一个或多个任务。对于我们需要的分支/循环等,这个引擎都有着不错的支持。回到框架本身,最基本的他需要自行定义若干步骤(Step),代码中体现为继承StepBody,并实现对应的虚方法,我们来定义一个最基本的步骤:
public class SayHello : StepBody
{
public override ExecutionResult Run(IStepExecutionContext context)
{
("Hello Guys !").ConsoleWithTime();//自己拓展的方法,不要纠结我为啥这么写
return ExecutionResult.Next();
}
}
各个步骤按照一定的顺序串起来就构成了工作流,以下来定义一个工作流:
public class ChatWorkflow : IWorkflow
{
public string Id => "ChatWorkflow";
public int Version => 1;
public void Build(IWorkflowBuilder<object> builder)
{
builder
.StartWith<SayHello>()
.Then<Sing_A_Song>()
.Then<SayGoodBye>();
}
}
到这边我们就完成了流的定义,剩下的工作就是让他动起来。
在启动工作流之前需要在服务中进行注册,注册完成我们就可以是start了。看代码:
public class Program
{
static void Main(string[] args)
{
IServiceProvider serviceProvider = ConfigureServices();
var host = serviceProvider.GetService<IWorkflowHost>();
host.RegisterWorkflow<ChatWorkflow>();
host.Start();
host.StartWorkflow("ChatWorkflow");
Console.ReadLine();
host.Stop();
}
private static IServiceProvider ConfigureServices()
{
IServiceCollection services = new ServiceCollection();
services.AddLogging();
services.AddWorkflow();
var builder = new ContainerBuilder();
builder.Populate(services);
return new AutofacServiceProvider(builder.Build());
}
}
结果来了:
很显然这个是最基本的功能实现,很多情况下是不满足我们要求的,接下来一起看看他的其他用法,我只简单介绍他可以做什么,不会一个个展开,他的文档中有些东西也很明了,如果有不明白的,留言我们一起探讨:
1、步骤间数据传递,步骤可以接收参数的,这样写一个步骤就可以实现多样的功能;
2、多种结果,类似分支结构,可以根据不同情况执行不同的步骤;
3、错误处理,可以捕捉执行过程中的异常,并处理,步骤的异常和流的异常都提供方法操作,出现出错可以设置挂起,终止和重试;
4、控制结构,支持循环/分支,还支持几个步骤并行执行;
5、支持持久化,提供MongoDB/SQL Server/PostgreSQL/Sqlite等拓展程序,可以直接使用;
6、支持集群;
7、支持从JSON加载工作流定义,但是步骤只能通过全限定名调用,意思只能加载流的定义,不能动态加载步骤的定义,步骤需要事先定义好,里面可以带参数;
8、计划和重复,可以设置定时执行和重复执行,可以设置满足某个条件时停止重复;
9、目标框架 .NET Standard 1.3 ,.net core也可以用;
10、我的学习能力有限,也没必要研究的很透,大家选型的时候可以作为参考,我列出来的并不是全部功能,如果有错误也请帮忙指出。
最后祝大家学习愉快。