elsa 输入与输出
在 Elsa 中,输入可以指两件事:
- 活动的输入。
- 工作流的输入。
同样,输出也可以指两件事:
- 活动的输出。
- 工作流的输出。
活动输入与输出
活动能够接收输入并返回输出。
输入通过活动的 ActivityExecutionContext
对象提供,该对象被传递给 ExecuteAsync
方法。
输出可以通过 ActivityExecutionContext
和 ExpressionExecutionContext
对象设置。
下面是一个接收输入并返回输出的自定义活动示例:
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);
}
}
上述活动接收两个输入 A
和 B
,并返回一个输出 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 表达式。例如,要访问输入 A
和 B
并计算它们的和,我们可以使用以下表达式:
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 来调用工作流,这在您想从其他应用程序调用工作流时非常有用。更多信息,请参见 调用工作流 章节。