来自客户端应用程序的 Elsa 工作流程 更新

问题描述

我正在考虑在一个项目中使用 Elsa 工作流,但我找不到关于如何在客户端应用程序中使用它的任何示例或文档 (xamarin.forms/blazor wasm)。我的想法是基本上定义工作流,其中还包括客户端应用程序中的屏幕转换。这是 Elsa 的相关场景,还是我不明白?我知道有一些 REST API 可用,但不知道如何使用它。

这篇很棒的文章解释了如何在 ASP.NET/后端场景中使用它https://sipkeschoorstra.medium.com/building-workflow-driven-net-core-applications-with-elsa-139523aa4c50

解决方法

这对 Elsa 来说是一个很好的用例,我正计划为其创建示例应用程序 + 指南。到目前为止,有关于使用 Elsa 执行长时间运行的“后端”流程的指南和示例,但现在有理由不能也使用它来实现应用程序导航逻辑,例如由作为单独屏幕实现的步骤组成的向导示例。

这就是你的答案:是的,这是一个相关的场景。但很遗憾,目前没有具体的样本可以指给您。

除了任何示例外,以下是它在客户端应用程序中的工作方式:

  1. 客户端应用程序已配置 Elsa 服务。
  2. 无论您决定将工作流存储在应用内(作为代码还是 JSON),还是存储在远程 Elsa Server 实例上都无关紧要 - 一旦您在内存中拥有工作流,您就可以执行它。
  3. 由于您的工作流将推动 UI,您必须考虑工作流与该 UI 的紧密耦合程度。例如,高度紧密耦合的工作流可能包括表示要呈现的视图(名称)的活动,包括转换配置(如果要配置某些内容)以及基于单击的按钮的结果。另一方面,高度松散耦合的工作流可能更像是操作和事件的“指挥者”或协调者,其中工作流仅由一堆原语组成,例如“SendCommand”和“Event Received”,其中一个“SendCommand”只是用你的应用程序处理的任务名称引发一些应用程序事件。 “Event Received”活动以另一种方式处理:您的应用程序向 Elsa 发出指令,Elsa 驱动工作流。任务可能是“导航”指令,下一个视图名称作为参数提供。

“SendCommand”和“EventReceived”活动是非常新的,是 Elsa 2.1 预览包的一部分。现在它们直接耦合到 webhook 场景(其中命令以 HTTP 请求的形式发送到外部应用程序),但目标是制定各种策略(HTTP 输出请求只是其中之一,另一个可能是用于进程内场景(例如您的客户端应用程序)的简单中介器模式)。

更新

要将设计器中设计的工作流检索到您的客户端应用程序中,您需要通过以下 API 端点获取工作流定义:

http(s)://your-elsa-server/v1/workflow-definitions/{workflow-definition-id}/Published

您将返回一个表示工作流定义的 JSON,您现在可以使用 IContentSerializer.Deserialize<WorkflowDefinition> 对其进行反序列化,这将为您提供一个 WorkflowDefinition。但是为了能够实际运行工作流,您需要一个工作流蓝图。要将工作流定义转换为蓝图,请使用`IWorkflowBlueprintMaterializer.CreateWorkflowBlueprintAsync(WorkflowDefinition)。

这会给你一个蓝图,然后可以使用例如执行IStartsWorkflow.StartWorkflowAsync(IWorkflowBlueprint)

还有各种其他服务可以更方便地构建和运行工作流。

为了让您的客户端应用程序尽可能顺畅,您可以考虑简单地实施 IWorkflowProvider,其中我们目前有 3 个开箱即用:

  1. ProgrammaticWorkflowProvider:根据使用 fluent Workflow Builder API 编码的工作流提供工作流蓝图。
  2. DatabaseWorkflowProvider:提供基于数据库中存储的蓝图(设计者存储的 JSON 模型)。
  3. StorageWorkflowProvider:根据存储在某些硬盘驱动器或 Blob 存储(如 Azure Blob 存储)上的 JSON 文件提供蓝图。

您可能会做的,实际上是我认为我们应该提供的现成的,现在您让我想到了,是创建第四个使用 API 端点从中获取工作流的提供程序。

那么您的客户端应用程序就不必费心调用 Elsa API - 提供商会为您完成。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...