从 JSON 加载 elsa 工作流
从 JSON 加载工作流是将工作流存储在数据库或文件系统中的绝佳方式。本指南将展示如何从 JSON 文件加载工作流。
控制台应用程序
从 JSON 文件加载工作流最直接的方式是简单地加载 JSON 文件的内容,反序列化它,然后执行反序列化的工作流。
下面是一个完整的 Program.cs
文件示例,演示了如何从 JSON 文件加载工作流并执行:
using Elsa.Extensions;
using Elsa.Testing.Shared;
using Elsa.Workflows.Core.Contracts;
using Elsa.Workflows.Core.Models;
using Microsoft.Extensions.DependencyInjection;
// 设置服务容器。
var services = new ServiceCollection();
// 添加Elsa服务。
services.AddElsa();
// 构建服务容器。
var serviceProvider = services.BuildServiceProvider();
// 填充注册表。仅对于不使用托管服务的应用程序是必要的。
await serviceProvider.PopulateRegistriesAsync();
// 从JSON文件导入工作流。
var workflowJson = await File.ReadAllTextAsync("HelloWorld.json");
// 获取反序列器以反序列化工作流。
var serializer = serviceProvider.GetRequiredService<IActivitySerializer>();
// 反序列化工作流。
var workflow = serializer.Deserialize<Workflow>(workflowJson);
// 解析工作流运行器以运行工作流。
var workflowRunner = serviceProvider.GetRequiredService<IWorkflowRunner>();
// 运行工作流。
await workflowRunner.RunAsync(workflow);
HelloWorld.json
文件存储在与 Program.cs
相同的目录中,并配置为如果比输出目录中的文件新,则复制到输出目录。
{
"id": "HelloWorld-v1",
"definitionId": "HelloWorld",
"name": "你好,世界",
"root": {
"id": "Flowchart1",
"type": "Elsa.Flowchart",
"activities": [
{
"id": "WriteLine1",
"type": "Elsa.WriteLine",
"text": {
"typeName": "String",
"expression": {
"type": "Literal",
"value": "你好,世界!"
},
"memoryReference": {
"id": "WriteLine1:input-1"
}
}
}
]
}
}
ASP.NET 应用程序
当在 ASP.NET
应用程序中运行 Elsa
时,您可能希望将存储在 JSON
中的工作流提供给工作流运行时。
工作流运行时依赖于 IWorkflowDefinitionProvider
实现来提供工作流定义。
开箱即用,Elsa
提供了以下提供商:
- ClrWorkflowDefinitionProvider
- FluentStorageWorkflowDefinitionProvider
ClrWorkflowDefinitionProvider
负责提供作为实现 IWorkflow
的 .NET
类型创建的工作流定义。
FluentStorageWorkflowDefinitionProvider
负责通过 IBlobStorage
提供的工作流定义,这是由 FluentStorage 库提供的 API。
除了内置的提供程序之外,您还可以实现自己的 IWorkflowDefinitionProvider
,以便从任何您想要的来源提供工作流定义。
然而,对于本章节,使用 FluentStorageWorkflowDefinitionProvider
从文件系统中存储的 JSON 文件提供工作流定义就足够了。
要设置这个,您需要做以下步骤:
- 按照 [ASP.NET 工作流服务器] 章节描述设置工作流服务器应用程序。
- 向工作流服务器项目添加对
Elsa.WorkflowProviders.FluentStorage
的包引用。 - 更新
Program.cs
以使用FluentStorageWorkflowDefinitionProvider
:
// 添加Elsa服务。
services.AddElsa(elsa => elsa
// 添加Fluent Storage工作流定义提供程序。
.UseFluentStorageProvider()
... // 其他配置。
默认情况下,fluent 存储提供程序将在 Workflows
文件夹中查找工作流定义。为了测试,创建一个名为 Workflows
的文件夹在项目的根目录下,并创建一个名为 hello-world.json
的新文件,内容如下:
{
"id": "hello-world-v1",
"definitionId": "hello-world",
"name": "你好,世界",
"isLatest": true,
"isPublished": true,
"version": 1,
"root": {
"id": "Flowchart1",
"type": "Elsa.Flowchart",
"activities": [
{
"id": "WriteLine1",
"type": "Elsa.WriteLine",
"text": {
"typeName": "String",
"expression": {
"type": "Literal",
"value": "你好,世界!"
},
"memoryReference": {
"id": "WriteLine1:input-1"
}
}
}
]
}
}
请注意工作流定义 ID,它是 hello-world
。 这是您使用 REST API 调用工作流时使用的 ID,例如。
curl --location --request POST 'https://localhost:5001/elsa/api/workflow-definitions/hello-world/execute' \
--header 'Authorization: ApiKey {your_api_key}'