从 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 文件提供工作流定义就足够了。 要设置这个,您需要做以下步骤:

  1. 按照 [ASP.NET 工作流服务器] 章节描述设置工作流服务器应用程序。
  2. 向工作流服务器项目添加对 Elsa.WorkflowProviders.FluentStorage 的包引用。
  3. 更新 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}'
在本文档中