当前位置: 首页 > news >正文

工业上位机项目的完整 MediatR 管道行为(Pipeline Behaviors)示例代码

** 工业上位机项目的完整 MediatR 管道行为(Pipeline Behaviors)示例代码**,包含工业级推荐的 4 个核心 Behavior。


1. 标记接口(推荐使用)

// MaxWell.Application/CQRS/Base/ICommand.cspublicinterfaceICommand<outTResponse>:IRequest<TResponse>{}// MaxWell.Application/CQRS/Base/IQuery.cspublicinterfaceIQuery<outTResponse>:IRequest<TResponse>{}// MaxWell.Application/CQRS/Base/ITransactionalCommand.cspublicinterfaceITransactionalCommand{}// 需要事务的 Command 实现此接口

2. 完整管道行为代码

Behavior 1:验证行为(ValidationBehavior)
// MaxWell.Application/Behaviors/ValidationBehavior.csusingFluentValidation;usingMediatR;usingSystem.Linq;namespaceMaxWell.Application.Behaviors;publicclassValidationBehavior<TRequest,TResponse>:IPipelineBehavior<TRequest,TResponse>whereTRequest:IRequest<TResponse>{privatereadonlyIEnumerable<IValidator<TRequest>>_validators;publicValidationBehavior(IEnumerable<IValidator<TRequest>>validators){_validators=validators;}publicasyncTask<TResponse>Handle(TRequestrequest,RequestHandlerDelegate<TResponse>next,CancellationTokenct){if(_validators==null||!_validators.Any())returnawaitnext();varcontext=newValidationContext<TRequest>(request);varvalidationResults=awaitTask.WhenAll(_validators.Select(v=>v.ValidateAsync(context,ct)));varfailures=validationResults.SelectMany(r=>r.Errors).Where(f=>f!=null).ToList();if(failures.Count>0){varerrorMessage=string.Join(Environment.NewLine,failures.Select(f=>f.ErrorMessage));thrownewValidationException($"命令验证失败:{errorMessage}");}returnawaitnext();}}
Behavior 2:日志 + 性能监控行为
// MaxWell.Application/Behaviors/LoggingAndPerformanceBehavior.csusingMediatR;usinglog4net;usingSystem.Diagnostics;usingSystem.Text.Json;namespaceMaxWell.Application.Behaviors;publicclassLoggingAndPerformanceBehavior<TRequest,TResponse>:IPipelineBehavior<TRequest,TResponse>whereTRequest:IRequest<TResponse>{privatestaticreadonlyILog_logger=LogManager.GetLogger("MediatR");publicasyncTask<TResponse>Handle(TRequestrequest,RequestHandlerDelegate<TResponse>next,CancellationTokenct){varrequestName=typeof(TRequest).Name;varsw=Stopwatch.StartNew();try{_logger.Info($"[MediatR START]{requestName}|{JsonSerializer.Serialize(request)}");varresponse=awaitnext();sw.Stop();varsuccess=responseisHardwareResulthr?hr.IsSuccess.ToString():"OK";_logger.Info($"[MediatR END]{requestName}| Success:{success}| 耗时:{sw.ElapsedMilliseconds}ms");returnresponse;}catch(Exceptionex){sw.Stop();_logger.Error($"[MediatR ERROR]{requestName}| 耗时:{sw.ElapsedMilliseconds}ms",ex);throw;}}}
Behavior 3:事务行为(仅针对需要事务的命令)
// MaxWell.Application/Behaviors/TransactionBehavior.csusingMediatR;usingMaxWell.Infrastructure.Persistence;namespaceMaxWell.Application.Behaviors;publicclassTransactionBehavior<TRequest,TResponse>:IPipelineBehavior<TRequest,TResponse>whereTRequest:IRequest<TResponse>{privatereadonlyAppDbContext_dbContext;publicTransactionBehavior(AppDbContextdbContext){_dbContext=dbContext;}publicasyncTask<TResponse>Handle(TRequestrequest,RequestHandlerDelegate<TResponse>next,CancellationTokenct){// 只对标记了 ITransactionalCommand 的命令启用事务if(requestisnotITransactionalCommand)returnawaitnext();awaitusingvartransaction=await_dbContext.Database.BeginTransactionAsync(ct);try{varresponse=awaitnext();awaittransaction.CommitAsync(ct);returnresponse;}catch(Exception){awaittransaction.RollbackAsync(ct);throw;}}}
Behavior 4:异常统一处理 + 短路行为(可选增强)
// MaxWell.Application/Behaviors/ExceptionHandlingBehavior.cspublicclassExceptionHandlingBehavior<TRequest,TResponse>:IPipelineBehavior<TRequest,TResponse>whereTRequest:IRequest<TResponse>{privatestaticreadonlyILog_logger=LogManager.GetLogger("MediatR.Exception");publicasyncTask<TResponse>Handle(TRequestrequest,RequestHandlerDelegate<TResponse>next,CancellationTokenct){try{returnawaitnext();}catch(ValidationExceptionvex){_logger.Warn($"验证失败:{typeof(TRequest).Name}",vex);throw;}catch(Exceptionex){_logger.Error($"执行命令时发生未处理异常:{typeof(TRequest).Name}",ex);if(typeof(TResponse)==typeof(HardwareResult)){return(TResponse)(object)HardwareResult.Fail($"系统异常:{ex.Message}");}throw;}}}

5. 在 App.xaml.cs 中注册(关键)

protectedoverridevoidRegisterTypes(IContainerRegistrycontainerRegistry){varservices=newServiceCollection();// ... 其他注册(DbContext、DeviceManager 等)services.AddMediatR(cfg=>{cfg.RegisterServicesFromAssembly(typeof(StartExperimentCommand).Assembly);});// 管道行为注册顺序非常重要(由外到内)services.AddTransient(typeof(IPipelineBehavior<,>),typeof(ValidationBehavior<,>));services.AddTransient(typeof(IPipelineBehavior<,>),typeof(ExceptionHandlingBehavior<,>));services.AddTransient(typeof(IPipelineBehavior<,>),typeof(LoggingAndPerformanceBehavior<,>));services.AddTransient(typeof(IPipelineBehavior<,>),typeof(TransactionBehavior<,>));_serviceProvider=services.BuildServiceProvider();containerRegistry.RegisterInstance(_serviceProvider);}

使用效果

当执行以下代码时:

varresult=await_mediator.Send(newStartExperimentCommand(...));

会依次经过:

  1. 验证 → 2. 异常处理 → 3. 日志记录 → 4. 事务(如果需要)→ Handler → 后置日志

推荐

  • ValidationBehavior放在最外层
  • ExceptionHandlingBehavior紧随其后
  • Logging放在中间
  • Transaction放在最内层(接近业务)
http://www.jsqmd.com/news/1176202/

相关文章:

  • Awesome Wails中的API工具集合:从Mock服务器到gRPC客户端
  • Arm Optimized Routines开发者指南:如何为ARM架构贡献优化代码
  • FastAsyncWorldEdit 开发者API指南:如何编写高性能的异步世界编辑插件?
  • 【Linux】一文吃透 ext2 文件系统:从磁盘块组、inode 到挂载完整拆解!
  • 2026 北京专业摄影学校综合排行榜,北京摄影学校推荐 - 职业学校推荐官
  • 3 款主流 CAN 分析工具对比:BUSMASTER vs PCAN-View vs TSMaster 功能实测
  • 亲身探访南京萧官方售后服务中心|地址与客户服务热线(2026年7月最新) - 亨得利官方服务中心
  • 广州小区配电房高压电力电缆回收报价 2026年7月电力版 高压电工持证 - 广东再生资源回收
  • 把材料练透,而非刷新材料:Echo Loop 英语听说训练 App 深度解析
  • HAMi异构计算虚拟化架构:技术决策框架与系统设计深度解析
  • 2026年7月广州电柜回收价格表 整厂设备打包回收一站式 - 广东再生资源回收
  • 2026年7月广州工程剩余变压器怎么处理 临建物资当天上门回收 - 广东再生资源回收
  • 涉外公证银行流水翻译怎么办理 - 点办通
  • Skinny ORM详解:基于ScalikeJDBC的高效数据库操作指南
  • Hacknight Beijing:基于阿里云与 Elastic 构建 AI Agents
  • FastAPI Contrib分页解决方案:Limit-Offset Pagination依赖注入的完整实现
  • 2026年7月南京峰云汇互邦圈介绍|南京本地企业家资源对接与经贸集采服务平台 - 资讯快报
  • 亨得利官方名表服务中心|全新维修地址与售后热线权威信息通知(2026年7月更新) - 亨得利官方博客
  • 深圳小区配电房高压电力电缆回收报价 2026年7月电力版 高压电工持证 - 广东再生资源回收
  • 欧米茄中国官方售后服务中心|网点地址与售后服务热线权威信息通告(2026年7月最新) - 欧米茄服务中心
  • 如何快速在Ubuntu上安装配置ibus-libpinyin输入法:终极中文输入解决方案
  • 解锁无损音质:TIDAL Hi-Fi 音乐播放器全解析与安装指南
  • 使用PyVISA + DM3058E万用表 + DSG3065B-IQ射频信号源自动化测量整流电路功率转换效率(PCE)
  • SlideView实战案例:构建登录页滑动验证与表单提交按钮
  • Kubernetes新手必备:使用Spekt8直观理解Pod、Service与Ingress关系
  • 打工人必看!办公表格工具红黑榜 - 品牌测评鉴赏家
  • Netgraph布局详解:从circular到geometric,7种布局一键实现
  • 【晨迹相机】HarmonyOS ArkTS 实战:极简调用系统相机:利用 cameraPicker 规避 Profile 只读限制
  • optiland点扩散函数PSF
  • 5步构建智能数据处理管道:DataFlow让AI数据准备变得简单高效