elsa 变量

在 Elsa 中,变量作为容器在工作流生命周期中存储和检索数据扮演着至关重要的角色。它们促进了活动之间的数据传输,并为这些活动使用的数据提供了存储。

变量结构

每个变量包含以下组件:

  • 名称:在工作流中唯一区分大小写的变量标识符。
  • 类型:定义变量的数据类型。
  • 默认值:创建时可选地分配给变量的默认值。
  • 存储提供程序:指定变量数据存储的位置。

组件详细说明

名称

变量的名称是工作流内唯一的标识符,确保了对变量访问和操作的精确性。

默认值

变量可能具有默认值,在变量初始化时使用。

变量类型

Elsa 工作流中的变量可以是 .NET 支持的任何类型,增强了数据处理的灵活性和多功能性。类型包括但不限于:

  • 字符串
  • 数字
  • 布尔值
  • 日期时间
  • 对象
  • 数组
  • 自定义类型

存储提供程序

存储提供程序决定了变量存储的位置。Elsa 工作流提供了两个内置提供程序:

  • 内存:变量仅在工作流生命周期内可访问。此提供程序适用于存储临时数据或非序列化数据。
  • 工作流实例:变量与工作流实例一起保存。此提供程序适用于需要为工作流生命周期保留的序列化数据的存储。

扩展性

自定义类型

Elsa 工作流支持自定义类型,允许开发者定义自己的类型并将其用作变量。例如,可以定义一个名为 Person 的自定义类型如下:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

要将自定义类型用作变量,只需按如下定义变量:

var person = builder.WithVariable<Person>().WithMemoryStorage();

要使该类型从设计器中可用,使用管理服务进行注册:

Program.cs

services.AddElsa(elsa =>
{
    elsa.UseWorkflowManagement(management =>
    {
        management.AddVariableType<Person>(category: "CRM");
    });
});

自定义存储提供程序

对于更高级的存储需求,通过实现 IStorageDriver 接口创建自定义存储提供程序,包含:

  • WriteAsync:在变量创建或更新时调用。
  • ReadAsync:当访问变量时被调用。
  • DeleteAsync:在删除变量时操作。

以下是展示自定义存储提供程序实现的基本示例:

public class MyStorageDriver : IStorageDriver
{
    public Task WriteAsync(string key, object value, CancellationToken cancellationToken = default)
    {
        // 实现将值写入自定义存储提供程序。
    }

    public Task<object?> ReadAsync(string key, CancellationToken cancellationToken = default)
    {
        // 实现从自定义存储提供程序读取值。
    }

    public Task DeleteAsync(string key, CancellationToken cancellationToken = default)
    {
        // 实现从自定义存储提供程序删除值。
    }
}

要注册自定义存储提供程序:

Program.cs

services.AddStorageDriver<MyStorageDriver>();

自定义存储提供程序拓宽了可能性,允许在各种平台(如数据库、文件、Redis、云存储提供商等)上存储变量。

在工作流中定义变量

在编程式和设计式工作流中无缝定义变量,以满足多样的开发需求。

编程式工作流

在编程式工作流中,使用 Variable 方法定义变量。下面是使用内存存储提供程序定义变量的示例:

public class Greeter : WorkflowBase
{
    public void Build(IWorkflowBuilder builder)
    {
        // 初始化一个名为 "Message" 的变量,默认值为 "Hello World!"。
        var message = builder.WithVariable<string>("Hello World!").WithMemoryStorage();

        // 将消息输出到控制台。
        builder.Root = new WriteLine(context => message.Get(context));
    }
}

设计式工作流

在设计式工作流中,使用“变量”面板来定义变量,如下例所示:

变量

结论

理解和有效利用变量对于优化 Elsa 工作流的功能和效率至关重要。通过掌握变量类型、存储提供程序和定义方法,增强您的工作流过程并确保在整个 Elsa 工作流中实现强大且可靠的数据处理。

在本文档中