如何使用Elsa Workflow在运行时生成工作流并实现存储、执行与格式转换
核心解决方案
方案1:直接发布已有WorkflowBlueprint
不需要手动做对象转换,直接使用Elsa官方封装的发布服务即可完成持久化:
- 控制器注入
IWorkflowDefinitionPublisher服务,该服务内部已经适配你项目配置的EF持久化方案,调用PublishAsync方法传入构建好的WorkflowBlueprint对象,会自动完成蓝图到WorkflowDefinition的转换、版本管理、数据落库操作,发布后的工作流可直接在Elsa仪表盘查看和管理。
示例代码:
// 控制器构造函数已注入IWorkflowBuilder、IWorkflowDefinitionPublisher public async Task<IActionResult> PublishCustomWorkflow() { // 你原有通过IWorkflowBuilder构建蓝图的逻辑 var workflowBlueprint = await _workflowBuilder.BuildWorkflowAsync(builder => { builder .StartWith<WriteLine>(act => act.Text = "自定义工作流执行成功") .Then<Finish>(); }); // 发布蓝图,自动持久化到EF数据库 var publishResult = await _workflowDefinitionPublisher.PublishAsync(workflowBlueprint); if (publishResult.Succeeded) { // 返回工作流定义ID,后续执行可直接使用该ID return Ok(publishResult.WorkflowDefinition.DefinitionId); } return BadRequest(publishResult.Errors); }
方案2:从零手动构建WorkflowDefinition
如果不需要通过IWorkflowBuilder生成蓝图,可直接构造WorkflowDefinition对象后存库:
- 手动填充工作流的活动定义、连接关系、版本标识等核心属性,注入
IWorkflowDefinitionStore服务调用SaveAsync方法完成持久化即可。
示例代码:
// 控制器构造函数已注入IWorkflowDefinitionStore public async Task<IActionResult> CreateWorkflowDirectly() { var customWorkflow = new WorkflowDefinition { DefinitionId = Guid.NewGuid().ToString("N"), Version = 1, Name = "手动构建工作流", IsPublished = true, IsLatest = true, // 配置活动节点 Activities = new List<ActivityDefinition> { new() { ActivityId = "step1", Type = nameof(WriteLine), Properties = new Dictionary<string, object> { { nameof(WriteLine.Text), "手动构建工作流测试" } } }, new() { ActivityId = "step2", Type = nameof(Finish) } }, // 配置活动流转关系 Connections = new List<ConnectionDefinition> { new() { SourceActivityId = "step1", TargetActivityId = "step2", Outcome = "Done" } } }; await _workflowDefinitionStore.SaveAsync(customWorkflow); return Ok(customWorkflow.DefinitionId); }
工作流触发执行
持久化完成后,注入IWorkflowInvoker服务即可按需调用工作流:
// 控制器构造函数已注入IWorkflowInvoker public async Task<IActionResult> RunWorkflow(string workflowDefinitionId) { // 可自定义传入工作流输入参数 var inputParams = new Dictionary<string, object> { { "CustomParam", "测试参数" } }; var executeResult = await _workflowInvoker.InvokeAsync(workflowDefinitionId, inputParams); return Ok(executeResult); }
注意事项
如果你使用的是Elsa 3.x版本,服务命名略有调整:
IWorkflowDefinitionPublisher对应替换为IWorkflowManager,IWorkflowInvoker对应替换为IWorkflowRuntime,核心逻辑保持不变。
内容的提问来源于stack exchange,提问作者Miki
相关产品推荐
相关产品推荐

