You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:54:00