elsa 自定义活动

在本章节中,我们将探讨如何编写自定义活动。

先决条件

在编写自定义活动之前,您需要拥有一个运行正常的 Elsa 应用程序。如果还没有,请按照 [安装 - 控制台应用] 指南进行操作。

编写自定义活动

向应用程序提供活动有多种方式。最简单的方法是创建一个继承自 CodeActivity 的类。

让我们看一个例子。

问候活动

假设我们想创建一个自定义活动,用于向控制台打印问候语。

首先,创建一个继承自 CodeActivity 的类:

using Elsa.Extensions;
using Elsa.Workflows.Core.Models;

namespace Demo;

public class Greeter : CodeActivity
{
    protected override void Execute(ActivityExecutionContext context)
    {
        Console.WriteLine("你好,世界!");
    }
}

接下来,我们需要将活动注册到工作流运行时。为此,请打开 Startup.cs 并在 Elsa 服务配置中添加以下行:

services.AddElsa(elsa => elsa.AddActivity<Greeter>());

为了尝试使用该活动,让我们创建一个使用它的工作流。创建一个新的 Workflow 对象如下:

var workflow = new Workflow
{
    Root =
    {
        new Greeter()
    }
};

最后,运行工作流:

await workflowRunner.RunAsync(workflow);

如果运行应用程序,应该会看到以下输出:

你好,世界!

向活动传递数据

让我们扩展 Greeter 活动,使其接受一个名字作为输入,并向控制台打印个性化的问候语。

首先,在活动类中添加一个名为 Name 的属性:

public class Greeter : CodeActivity
{
    public Input<string> Name { get; set; } = default!;
}

接下来,更新 Execute 方法以使用 Name 属性:

protected override void Execute(ActivityExecutionContext context)
{
    Console.WriteLine($"你好,{Name.Get(context)}!");
}

最后,更新工作流以向活动传递一个名字:

var workflow = new Workflow
{
    Root =
    {
        new Greeter
        {
            Name = new("世界")
        }
    }
};

如果运行应用程序,应该会看到以下输出:

你好,世界!

从活动传递数据

让我们扩展 Greeter 活动,使其返回问候语作为输出。

首先,将活动基类型从 CodeActivity 更改为 CodeActivity<string>

public class Greeter : CodeActivity<string>
{
}

接下来,更新 Execute 方法以返回问候语:

protected override string Execute(ActivityExecutionContext context)
{
    var name = Name.Get(context);
    var message = $"你好,{name}!";
    context.SetResult(message);
}

最后,更新工作流以使用活动的输出:


// 创建一个变量来存储问候语。
var greeting = new Variable<string>();

// 创建一个工作流。
var workflow = new Workflow
{
    // 将变量添加到工作流中。
    Variables = { greeting },

    // 添加活动到工作流中。
    Root = new Sequence
    {
        Activities =
        {
            new Greeter
            {
                Name = new("世界"),

                // 将变量设置为活动的输出。
                Result = new(greeting)
            },

            // 将问候语打印到控制台。
            new WriteLine(context => $"问候语是:{greeting.Get(context)}")
        }
    }
};

注意我们正在使用 Result 属性来将变量设置为活动的输出。同时注意,我们将工作流的根活动更改为 Sequence 活动。这允许我们向工作流中添加多个活动。

如果你运行应用程序,你应该看到以下输出:

问候语是: 你好,世界!

工作流设计器

自定义活动可以在工作流设计器中使用。

创建应用

要尝试,请按照 [安装 - Elsa Studio] 指南创建一个新的 ASP.NET 应用。

创建活动

在你刚刚创建的应用中,创建一个名为 Activities 的新文件夹,并使用之前编写的代码向其中添加一个名为 Greeter 的新类:

using Elsa.Extensions;
using Elsa.Workflows.Core.Models;

namespace Demo;

public class Greeter : CodeActivity<string>
{
    public Input<string> Name { get; set; } = default!;

    protected override void Execute(ActivityExecutionContext context)
    {
        var name = Name.Get(context);
        var message = $"你好, {name}!";
        context.SetResult(message);
    }
}

注册活动

接下来,打开 Program.cs 并向 Elsa 服务配置中添加以下行:

services
    .AddElsa(elsa => elsa
        .AddActivity<Greeter>()
        ...

创建工作流

运行应用并创建一个新的工作流定义。你应该能在工具箱中看到 Greeter 活动。

活动工具箱和Greeter活动

为了使用它,我们需要将其添加到工作流中。从工具箱中拖拽 Greeter 活动到工作流设计器上。

在属性面板中为活动输入一个名称。

Greeter活动输入

接下来,让我们向工作流中添加一个 WriteLine 活动。从工具箱中拖拽 WriteLine 活动到工作流设计器上,并将其与 Greeter 活动连接起来。

WriteLine活动输入

为了让 WriteLine 活动打印问候语,我们需要将其 Text 属性设置为一个表达式,该表达式使用 Greeter 活动的输出。在使用 Greeter 活动的输出之前,我们需要像控制台示例中那样将其捕获到一个工作流变量中。

使用设计器时,我们可以通过 “变量” 面板来定义工作流变量。

工作流变量面板

点击 “添加” 按钮添加一个新变量。为变量输入一个名称并选择 string 类型。

工作流变量面板

接下来,我们需要将 Greeter 活动的 Result 属性设置为我们刚刚创建的变量。

Greeter活动输出

最后,我们可以将 WriteLine 活动的 Text 属性设置为一个使用变量的表达式。我们使用以下 JavaScript 表达式:

`问候语是: ${getMessage()}`;

WriteLine活动输入

运行工作流

为了运行工作流,请确保先发布你的更改

然后从属性面板复制工作流定义 ID

工作流属性面板

最后,发送以下 HTTP 请求(使用 Postman、cURL 等):

curl --location 'https://localhost:5001/elsa/api/workflow-definitions/{workflow_definition_id}/execute' \
--header 'Content-Type: application/json' \
--header 'Authorization: ApiKey {api_key}' \
--data '{
}'

当你查看应用程序的控制台输出时,你应该会看到以下消息:

问候语是: 你好, 世界!
在本文档中