如何在控制器中基于Workflow模型启动Elsa工作流并获取实例ID
Elsa Workflow 启动实例与输入设置解决方案
一、需要注入的核心服务
在API控制器中,需注入以下Elsa核心服务来完成工作流实例创建、启动及输入管理:
IWorkflowRuntime:负责启动工作流实例并返回实例信息IWorkflowRegistry:用于查询管理员已发布的工作流定义IWorkflowInstanceStore:(可选)用于持久化或更新工作流实例的输入/状态
二、正确启动工作流实例并获取实例ID
你可以优化代码逻辑,直接通过工作流名称查找定义并启动实例,高效获取实例ID:
using Elsa.Models; using Elsa.Services; using Microsoft.AspNetCore.Mvc; [ApiController] [Route("api/entities")] public class EntityWorkflowController : ControllerBase { private readonly IWorkflowRuntime _workflowRuntime; private readonly IWorkflowRegistry _workflowRegistry; // 构造函数注入所需服务 public EntityWorkflowController(IWorkflowRuntime workflowRuntime, IWorkflowRegistry workflowRegistry) { _workflowRuntime = workflowRuntime; _workflowRegistry = workflowRegistry; } [HttpPost("{entityId}/start-flow")] public async Task<IActionResult> StartFlowOfSomeEntity(int entityId) { // 1. 根据工作流名称查找最新版本的已发布定义 var workflowDefinition = await _workflowRegistry.FindByNameAsync( "MyFlowName", VersionOptions.Latest, CancellationToken.None); if (workflowDefinition == null) return NotFound("指定的工作流定义不存在"); // 2. 准备关联实体的业务输入参数 var input = new Dictionary<string, object> { ["EntityId"] = entityId, // 可添加其他业务参数,如审批人、实体类型等 }; // 3. 启动工作流并获取实例ID var workflowInstance = await _workflowRuntime.StartWorkflowAsync( workflowDefinitionId: workflowDefinition.Id, input: input, cancellationToken: CancellationToken.None); return Ok(new { WorkflowInstanceId = workflowInstance.Id }); } }
三、设置工作流输入的正确方式
你之前使用WorkflowStorageService.UpdateInputAsync的方式不符合Elsa的最佳实践,正确的输入设置分为两种场景:
- 启动时传入输入:如上述代码所示,在
StartWorkflowAsync中直接通过input参数传递,工作流启动即可直接使用这些参数,这是最推荐的方式。 - 运行中更新输入:若需在实例启动后修改输入,使用
IWorkflowInstanceStore持久化更新,示例如下:
private readonly IWorkflowInstanceStore _workflowInstanceStore; // 构造函数补充注入IWorkflowInstanceStore public EntityWorkflowController(IWorkflowRuntime workflowRuntime, IWorkflowRegistry workflowRegistry, IWorkflowInstanceStore workflowInstanceStore) { _workflowRuntime = workflowRuntime; _workflowRegistry = workflowRegistry; _workflowInstanceStore = workflowInstanceStore; } [HttpPatch("{workflowInstanceId}/update-input")] public async Task<IActionResult> UpdateWorkflowInput(string workflowInstanceId, int newEntityId) { // 查找目标工作流实例 var workflowInstance = await _workflowInstanceStore.FindByIdAsync(workflowInstanceId, CancellationToken.None); if (workflowInstance == null) return NotFound("工作流实例不存在"); // 更新输入参数 workflowInstance.Input["EntityId"] = newEntityId; // 持久化更新 await _workflowInstanceStore.SaveAsync(workflowInstance, CancellationToken.None); return Ok("输入参数已更新"); }
四、关键注意事项
- 确保工作流定义处于已发布状态,否则
IWorkflowRegistry无法查询到有效定义。 - 工作流名称
MyFlowName需与管理员创建的模型名称完全一致,注意大小写和拼写。 - 若需跟踪实例状态,可通过
IWorkflowInstanceStore查询实例的Status属性(如Running、Completed、Faulted等)。
内容的提问来源于stack exchange,提问作者Doma NZ
相关产品推荐
相关产品推荐

