这对 Elsa 来说是一个很好的用例,我正计划为此创建一个示例应用程序 + 指南。到目前为止,有关于使用 Elsa 执行长时间运行的“后端”进程的指南和示例,但现在有理由不能也使用它来实现应用程序导航逻辑,例如由实现为单独屏幕的步骤组成的向导例子。
所以这就是你的答案:是的,这是一个相关的场景。但不幸的是,目前没有具体的样本可供您参考。
除非有任何示例,否则它在客户端应用程序中的工作方式如下:
- 客户端应用程序配置了 Elsa 服务。
- 无论您决定将工作流存储在应用程序中(作为代码还是 JSON)还是在远程 Elsa Server 实例上都无关紧要 - 一旦您在内存中拥有一个工作流,您就可以执行它。
- 由于您的工作流程将驱动 UI,因此您必须考虑工作流程与该 UI 的紧密耦合程度。例如,一个高度紧密耦合的工作流可能包括表示要呈现的视图(名称)的活动,包括转换配置(如果需要配置),以及基于单击的按钮的结果。另一方面,高度松散耦合的工作流可能更多地充当动作和事件的“指挥者”或协调者,其中工作流仅由一堆原语组成,例如“SendCommand”和“Event Received”,其中一个“SendCommand”只是引发一些应用程序事件,其任务名称是您的应用程序然后处理的。“Event Received”活动以相反的方式处理:您的应用程序向 Elsa 发出指令,Elsa 负责推动工作流程。任务可能是“导航”指令,下一个视图名称作为参数提供。
“SendCommand”和“EventReceived”活动是非常新的并且是 Elsa 2.1 预览包的一部分。现在它们直接耦合到 webhook 场景(命令以 HTTP 请求的形式发送到外部应用程序),但目标是制定各种策略(HTTP out 请求只是其中之一,另一个可能是用于进程内场景(例如您的客户端应用程序)的简单中介模式)。
更新
要将设计器中设计的工作流检索到您的客户端应用程序中,您需要通过以下 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 个开箱即用:
- ProgrammaticWorkflowProvider:提供基于使用 fluent Workflow Builder API 编码的工作流的工作流蓝图。
- DatabaseWorkflowProvider:提供基于存储在数据库中的蓝图(设计者存储的 JSON 模型)。
- StorageWorkflowProvider:提供基于存储在某些硬盘驱动器或 blob 存储(如 Azure Blob 存储)上的 JSON 文件的蓝图。
你可能会做的,事实上我认为我们应该提供开箱即用的东西,因为你让我想到了它,是创建第四个提供者,它使用 API 端点来获取工作流。
那么您的客户端应用程序不必为调用 Elsa API 而烦恼 - 提供程序会为您完成。