WorkflowCore 支持采用JSON或者YAML格式定义流程,使用时通过使用IDefintionLoader加载流程来替代RegisterWorkflow。我们仍然通过简单的例子来说明。在我们现有的工程中已经定义了几个简单的流程步骤,我们用JSON格式将这几个步骤组成简单的工作流。
首先,在现有的解决方案中增加一个.Net Core的控制台项目,名称为ZL.WorkflowCoreDemo.Json,使用NuGet引入WorkflowCore,Microsoft.Extensions.Logging,还有WorkflowCore.DSL,然后,我们在项目中增加一个json文件,将文件的属性“复制到输出目录”修改为“始终复制”:

图片.png
在json文件中定义流程:
{
"Id": "HelloWorld",
"Version": 1,
"Steps": [
{
"Id": "Hello",
"StepType": "ZL.WorflowCoreDemo.Basic.Steps.HelloWorld,ZL.WorflowCoreDemo",
"NextStepId": "Bye"
},
{
"Id": "Bye",
"StepType": "ZL.WorflowCoreDemo.Basic.Steps.GoodbyeWorld,ZL.WorflowCoreDemo"
}
]
}
Json定义格式符合WorkflowCore的DSL,这里不进行DSL的详细介绍,我们重点关注流程如何定义,加载和运行。
我们可以将前面项目中的代码拷贝过来进行修改,首先修改下面的函数:
private static IServiceProvider ConfigureServices()
{
//setup dependency injection
IServiceCollection services = new ServiceCollection();
services.AddLogging();
services.AddWorkflow();
//这是新增加的服务
services.AddWorkflowDSL();
var serviceProvider = services.BuildServiceProvider();
return serviceProvider;
}
ConfigureServices新增加了services.AddWorkflowDSL();
在主函数中,使用IDefintionLoader加载JSON格式的流程定义:
static void Main(string[] args)
{
IServiceProvider serviceProvider = ConfigureServices();
var loader = serviceProvider.GetService<IDefinitionLoader>();
var json = System.IO.File.ReadAllText("myflow.json");
loader.LoadDefinition(json, Deserializers.Json);
var host = serviceProvider.GetService<IWorkflowHost>();
host.Start();
host.StartWorkflow("HelloWorld", 1, null);
Console.ReadLine();
host.Stop();
}
现在,流程可以运行了:

图片.png
在研究过程中发现了一个坑,可能需要注意。在这个例子中我们使用了前面项目定义的流程步骤,如果在本项目中定义流程步骤,会出现找不到相应动态库的错误,不知道是否是一个缺陷。