从零到一:基于Blazor和Elsa Workflows的工作流系统开发实战

张开发
2026/4/15 15:26:31 15 分钟阅读

分享文章

从零到一:基于Blazor和Elsa Workflows的工作流系统开发实战
从零到一基于Blazor和Elsa Workflows的工作流系统开发实战在数字化转型浪潮中企业流程自动化需求呈现爆发式增长。传统工作流解决方案往往面临开发周期长、灵活性不足的痛点而现代低代码技术栈的崛起为这一问题提供了全新解法。本文将带您深入探索如何利用Blazor的组件化优势与Elsa Workflows的动态编排能力构建一个高响应、可扩展的订单处理系统。不同于简单Demo拼接我们将从生产环境视角出发重点解决以下核心问题如何设计领域模型与工作流的映射关系当审批规则变更时如何实现热更新前端如何与工作流引擎深度交互1. 技术选型与架构设计选择BlazorElsa的技术组合绝非偶然。Blazor作为微软新一代Web框架其组件化开发模式与C#全栈特性能显著降低前后端协作成本。而Elsa Workflows作为.NET生态中最活跃的工作流引擎其可视化设计器与动态加载特性恰好弥补了传统工作流框架的僵化缺陷。典型架构分层graph TD A[Blazor WASM] --|HTTP| B(ASP.NET Core API) B --|EF Core| C[(SQL Server)] B -- D[Elsa Workflow Server] D -- C D -- E[Redis]表技术栈版本要求组件版本关键特性.NET8.0原生AOT支持Elsa3.0分布式锁机制BlazorWASM离线运行能力实际项目中我们采用领域驱动设计DDD与CQRS模式的组合订单聚合根负责状态一致性工作流仅处理流程跳转逻辑通过MediatR实现读写分离2. 环境配置与核心模块搭建2.1 初始化项目结构推荐使用Nx工作区管理多项目依赖dotnet new blazorwasm -n OrderFlow.Client dotnet new webapi -n OrderFlow.Api dotnet new classlib -n OrderFlow.Workflows关键NuGet包选择策略!-- 避免过度依赖Elsa全部模块 -- PackageReference IncludeElsa.Core Version3.0.1 / PackageReference IncludeElsa.Persistence.EntityFramework Version3.0.1 / PackageReference IncludeElsa.Activities.Email Version3.0.1 /2.2 数据库上下文配置针对SQL Server的优化配置services.AddElsa(elsa elsa .UseEntityFrameworkPersistence(ef ef.UseSqlServer(Configuration.GetConnectionString(WorkflowDB), sql sql.MigrationsAssembly(OrderFlow.Api))));重要提示务必为工作流表添加分库分表策略避免单表数据量过大影响性能3. 动态工作流建模实践3.1 订单状态机设计采用状态模式实现业务逻辑与流程解耦public class OrderStateMachine : IOrderState { private readonly IWorkflowRunner _workflowRunner; public async Task ApproveAsync(Order order) { await _workflowRunner.TriggerSignalAsync( OrderApprovalSignal, new { OrderId order.Id }); order.Status OrderStatus.Approved; } }3.2 自定义活动开发实现带条件判断的审批活动public class ConditionalApprovalActivity : Activity { [ActivityInput] public decimal AmountThreshold { get; set; } protected override async ValueTaskIActivityExecutionResult ExecuteAsync( ActivityExecutionContext context) { var order context.GetInputOrder(); var outcome order.TotalAmount AmountThreshold ? RequiresManagerApproval : AutoApproved; return Outcome(outcome); } }4. Blazor前端深度集成4.1 工作流设计器嵌入在Blazor中加载Elsa Studio的优化方案iframe ref_studioFrame src/_elsa/studio classw-full h-screen / code { private ElementReference _studioFrame; protected override async Task OnAfterRenderAsync(bool firstRender) { await _jsRuntime.InvokeVoidAsync( setIframeHeight, _studioFrame, 100%); } }4.2 实时状态看板利用SignalR实现流程状态推送public class WorkflowNotificationHub : Hub { public async Task SubscribeToOrder(string orderId) { await Groups.AddToGroupAsync( Context.ConnectionId, $Order-{orderId}); } }前端消费代码示例const connection new signalR.HubConnectionBuilder() .withUrl(/workflowHub) .configureLogging(signalR.LogLevel.Information) .build(); connection.on(WorkflowUpdated, (update) { Toastify({ text: 状态变更: ${update.status} }).showToast(); });5. 生产环境部署策略5.1 水平扩展方案Elsa在Kubernetes中的部署要点apiVersion: apps/v1 kind: Deployment spec: replicas: 3 template: spec: containers: - name: workflow-server env: - name: ELSA__SERVER__BASEURL value: http://elsa-cluster:13000 - name: REDIS_CONNECTION_STRING value: redis-cluster:63795.2 性能监控配置集成Prometheus监控指标services.AddElsaMetrics(metrics metrics .AddPrometheusCollection() .AddRuntimeMetrics());关键监控指标说明elsa_workflow_execution_time流程执行耗时elsa_activity_execution_count活动执行次数elsa_faulted_workflows异常流程数6. 进阶优化技巧6.1 流程版本控制实现蓝绿部署的工作流services.AddElsa(options options .UseVersionMigration(migration migration .WithRollbackSupport() .WithVersionHeader(X-Workflow-Version)));6.2 测试策略工作流单元测试示例[Fact] public async Task Should_Transition_To_Approved_When_Amount_Low() { // Arrange var workflow new OrderApprovalWorkflow(); var order new Order { TotalAmount 999 }; // Act var result await _workflowRunner.RunWorkflowAsync( workflow, new WorkflowInput(order)); // Assert Assert.Equal(Approved, result.Output[Status]); }在电商订单处理场景中我们通过动态加载工作流规则将审批流程变更时间从原来的2天缩短至30分钟。某次大促期间系统成功处理了单日超过12万笔订单的自动化审批平均处理延迟控制在800毫秒以内。

更多文章