elsa 输入与输出

在 Elsa 中,输入可以指两件事:

  • 活动的输入。
  • 工作流的输入。

同样,输出也可以指两件事:

  • 活动的输出。
  • 工作流的输出。

活动输入与输出

活动能够接收输入并返回输出。

输入通过活动的 ActivityExecutionContext 对象提供,该对象被传递给 ExecuteAsync 方法。

输出可以通过 ActivityExecutionContextExpressionExecutionContext 对象设置。

下面是一个接收输入并返回输出的自定义活动示例:

public class Sum : CodeActivity<int>
{
    public Sum(Variable<int> a, Variable<int> b, Variable<int> result)
    {
        A = new(a);
        B = new(b);
        Result = new(result);
    }

    public Input<int> A { get; set; } = default!;
    public Input<int> B { get; set; } = default!;

    protected override void Execute(ActivityExecutionContext context)
    {
        var a = A.Get(context);
        var b = B.Get(context);

        var result = a + b;

        context.SetResult(result);
    }
}

上述活动接收两个输入 AB ,并返回一个输出 Result

我们在 上一章节 中已经看到这个活动的应用 。

工作流输入与输出

工作流同样可以接收输入并返回输出。

输入

例如,假设我们有一个工作流,我们希望它能回显收到的输入:

var workflow = new WriteLine(context => $"Echo: {context.GetInput<string>("Message")}!");

// 创建一个输入字典。
var input = new Dictionary<string, object>
{
    ["Message"] = "Hello World!"
};

// 运行工作流并传递输入。
await workflowRunner.RunAsync(workflow, new RunWorkflowOptions(input: input));

上述工作流接收单个输入Message,并将其打印到控制台。

输出

以下示例演示了如何从工作流返回输出:

// 创建一个返回某些输出的工作流。
var workflow = new Inline(context => context.WorkflowExecutionContext.Output["Message"] = "Hello from workflow!");

// 运行工作流并保留其工作流状态。
var result = await workflowRunner.RunAsync(workflow);

// 获取输出。
var output = result.WorkflowState.Output["Message"];

Console.WriteLine($"Output: {output}");

关键点在于,为了将工作流的输出提供给调用应用程序,我们需要在 WorkflowExecutionContext 对象的 Output 属性上设置输出。每个活动都可以通过传递给 ExecuteAsync 方法的 ActivityExecutionContext 参数访问 WorkflowExecutionContext 对象。

设计器

设计器通过 “输入/输出” 标签页提供了一种便捷的方式来定义工作流的输入与输出。

工作流输入与输出

要访问这些输入,我们可以使用 JavaScript 表达式。例如,要访问输入 AB 并计算它们的和,我们可以使用以下表达式:

getA() + getB();

要将输出返回到调用工作流的代码,我们可以使用 Set Output 活动:

工作流输入与输出

调用工作流

如果我们发布这个工作流,并使用 IWorkflowRuntime 服务调用它,我们可以通过 WorkflowExecutionContext 对象的 Output 属性访问输出:

var input = new Dictionary<string, object>
{
    ["A"] = 1,
    ["B"] = 2
};
var definitionId = "be1e175cce4147d0beaa13ea15f5741c";
var startWorkflowOptions = new StartWorkflowRuntimeOptions(input: input);
var result = await _workflowRuntime.StartWorkflowAsync(definitionId, startWorkflowOptions);
var sum = (int)result.WorkflowExecutionContext.Output["Sum"];

调用工作流

上述示例展示了如何使用IWorkflowRuntime服务调用工作流。您也可以使用 HTTP API 来调用工作流,这在您想从其他应用程序调用工作流时非常有用。更多信息,请参见 调用工作流 章节。

在本文档中