在.Net Framework环境下,我们使用使用Windows Workflow Foundation(WF)作为项目的工作流引擎,可是.Net Core已经不支持WF了,我们需要为基于.Net Core的项目选择新的工作流引擎。基本要求如下:
- 轻量级,部署和使用都很简单。
- 有相当数量的用户,往往使用的人越多,产品也就越可靠,遇到问题也容易找到解决办法。
- 支持使用配置文件定义工作流,而不仅仅是使用代码定义。
- 最好基于.Net Standard,这样既可以用于.Net Core的项目,也可以用于.Net Framework
经过一些调研,初步确定使用开源项目WorkflowCore,这里对这个项目的使用做简单的介绍,我们通过创建一个简单的控制台项目说明如何使用。
首先,使用Visual Studio 2019创建一个.Net Core的控制台项目,我使用的.Net Core版本是3.1。然后,在NuGet管理器中引入:
- WorkflowCore
- Microsoft.Extensions.DependencyInjection
- Microsoft.Extensions.Logging
然后,创建两个工作流的步骤:
using WorkflowCore.Interface;
using WorkflowCore.Models;
namespace WorkflowCoreTest
{
public class HelloWorld : StepBody
{
public override ExecutionResult Run(IStepExecutionContext context)
{
Console.WriteLine("你好");
return ExecutionResult.Next();
}
}
}
using WorkflowCore.Interface;
using WorkflowCore.Models;
namespace WorkflowCoreTest
{
public class GoodbyeWorld : StepBody
{
public override ExecutionResult Run(IStepExecutionContext context)
{
Console.WriteLine("再见");
return ExecutionResult.Next();
}
}
}
接下来使用这两个步骤定义一个工作流:
using WorkflowCore.Interface;
namespace WorkflowCoreTest
{
public class HelloWorldWorkflow : IWorkflow
{
public string Id => "HelloWorld";
public int Version => 1;
public void Build(IWorkflowBuilder<object> builder)
{
builder
.StartWith<HelloWorld>()
.Then<GoodbyeWorld>();
}
}
}
最后,在主程序中,创建WorkflowHost,注册并运行工作流,代码如下:
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Threading;
using WorkflowCore.Interface;
namespace WorkflowCoreTest
{
class Program
{
static void Main(string[] args)
{
IServiceProvider serviceProvider = ConfigureServices();
var host = serviceProvider.GetService<IWorkflowHost>();
host.RegisterWorkflow<HelloWorldWorkflow>();
host.Start();
host.StartWorkflow("HelloWorld", 1, null);
Console.ReadLine();
host.Stop();
}
private static IServiceProvider ConfigureServices()
{
//setup dependency injection
IServiceCollection services = new ServiceCollection();
services.AddLogging();
services.AddWorkflow();
var serviceProvider = services.BuildServiceProvider();
return serviceProvider;
}
}
}
运行效果如下:
接下来,我们会进一步介绍这个项目,并说明如何落地到具体的项目。