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); } }
C#

上述活动接收两个输入 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));
C#

上述工作流接收单个输入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}");
C#

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

设计器

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

工作流输入与输出

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

getA() + getB();
JavaScript

要将输出返回到调用工作流的代码,我们可以使用 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"];
C#

调用工作流

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