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

C#怎么实现发布订阅模式 C#如何用事件总线EventBus实现模块间的松耦合消息通信【架构】

C#原生event+delegate可实现发布订阅,需用private字段封装event、判空调用、及时反订阅防泄漏;MediatR适用于需管道中间件的场景,Channel<T>适合后台批量消费,事件总线非万能解耦方案。用 event + delegate 实现最简发布订阅不用引入任何第三方库,C# 原生就能跑通核心逻辑。关键不是“怎么写”,而是“谁该负责订阅、谁该触发、委托签名要不要泛型”。常见错误是把 event 声明成 public 字段——这会让外部直接赋值覆盖所有监听器,彻底破坏订阅机制。必须用 private 字段 + public 事件包装器,或直接用自动实现的 event。delegate 类型推荐用 Action<T> 或自定义泛型委托,避免为每种消息类型写一堆非泛型委托触发事件前务必判空:MyEvent?.Invoke(data),否则空引用异常在生产环境很难定位如果发布者生命周期短于订阅者(比如窗体关闭后后台任务还在发消息),记得在释放时调用 -= 反订阅,否则引发内存泄漏public class NewsPublisher{ public event Action<string> NewsPublished; public void Publish(string news) => NewsPublished?.Invoke(news);}用 MediatR 替代手写 EventBus 的真实理由MediatR 不是“更高级的 EventBus”,它是把请求/响应、通知、管道中间件这几层职责拆清楚了。如果你只想要“发个消息让别人收到”,用它反而绕路;但如果你需要“发完消息后统一加日志、验证、事务包装”,它就省掉大量胶水代码。容易踩的坑是混淆 IRequestHandler 和 INotificationHandler:前者是一对一同步处理(如保存订单),后者才是一对多广播(即传统意义上的发布订阅)。注册必须用 AddMediatR(Assembly),漏掉程序集会导致 Handler not found 错误,且无明确提示INotification 默认异步执行,但不会自动 await 所有 handler —— 如果某个 handler 抛异常,其他 handler 仍会继续执行,这点和原生 event 不同不要在 handler 里直接 new DbContext,MediatR 的 scope 生命周期和 ASP.NET Core 的 request scope 对齐,应通过构造函数注入System.Threading.Channels 适合什么场景下的“发布订阅”当你的“订阅者”其实是消费者线程(比如后台工作队列、批量处理任务),而不是 UI 更新或业务逻辑响应时,Channel<T> 比事件模型更合适。它天然支持背压、限流、取消,且不依赖对象引用关系。 VWO 一个A/B测试工具

http://www.jsqmd.com/news/673942/

相关文章:

  • AI赋能:工程师的五大超能力进化
  • 避开这些坑!机载条带SAR回波仿真中的参数设置与结果验证指南
  • 飞秋Mac版:终极开源局域网通信工具完全指南
  • # 004、决策大脑:从传统图像处理到深度学习的目标识别算法演进
  • 爱毕业(aibiye)优化数学建模论文的复现流程,确保智能排版的高效与准确
  • 2026届最火的六大AI学术神器解析与推荐
  • Dify 2026工作流引擎升级全解析:如何用新编排能力将AI应用交付周期缩短67%?
  • Windows 11 + Python 3.8 保姆级教程:手把手搞定OpenVINO 2023.2环境配置(含VS2019、CMake避坑指南)
  • 网盘直链下载助手终极指南:告别限速,轻松获取真实下载地址的8大秘诀
  • AI Agent Harness模型切换与兼容设计
  • 别再用笨方法数格子了!用BFS/DFS算法5分钟搞定不规则图形面积计算(附C++代码)
  • 057.YOLOv5代码调试技巧:用VSCode/PyCharm给深度学习“把脉”
  • XJoy终极指南:将闲置Joy-Con变身高性能PC游戏手柄的完整方案
  • 怎么部署 sqli-Labs(SQL 注入练习靶场)及less1、2讲解
  • ESP-SR V2.0架构解密:嵌入式语音识别的性能突破与实战优化
  • React 电视端应用:处理遥控器焦点管理(Focus Management)的 React 高阶组件封装
  • 从ROS1到ROS2:手把手带你理解通信架构巨变,以及如何为你的项目选对DDS实现(Cyclone DDS vs Fast DDS)
  • 2025届必备的AI辅助写作平台实际效果
  • 3步快速上手:Free Texture Packer高效精灵表制作完全指南
  • Spring Boot 4.0 Agent-Ready 架构演进深度解析(Agent生命周期管理大揭秘)
  • 从水泵选型踩坑到高效运行:一份给工程师的流体机械实战避坑指南(含Simerics MP+应用)
  • 告别单窗口!MPLAB X IDE多开与MCC配置冲突的保姆级解决方案
  • G-Helper:华硕笔记本的轻量级性能控制神器
  • 3步掌握AI语音克隆:RVC变声神器零基础完整教程
  • 保研面试避坑指南:除了复习专业课,这些细节(如简历错误、英语翻译、项目复盘)同样致命
  • php for循环?_?PHP中for循环的语法结构与执行流程详解
  • 为什么90%的农业知识库项目失败?Dify底层代码设计缺陷曝光及4步重构法
  • FPGA新手必看:如何用74HC595级联驱动数码管(附完整Verilog代码)
  • Bootstrap框架中常见的表单验证样式实现
  • solidworks方管插槽 薄片和槽口功能