C# | MediatR 入门指南:后端架构解耦

C# MediatR 入门指南:后端架构解耦

### 文章目录

  • [C# MediatR 入门指南:后端架构解耦](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [@toc](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [1 什么是 MediatR](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [1.1 概念讲解](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [1.2 类似的组件/设计模式对比](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [1.3 MediatR 在 .NET 生态中的发展历程](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [2 MediatR 代码与传统代码的对比](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [2.1 根据对比讲解 MediatR 的核心特点](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [传统代码风格](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [MediatR 代码风格](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [核心特点总结](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [2.2 MediatR 代码架构上的优势](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [2.3 帮助新手理解 MediatR 交互逻辑的方法](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [3 使用 MediatR 的意义](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [3.1 应用场景](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [3.2 维护性与扩展性的提升](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [3.3 通过案例讲解:用户注册逻辑演进](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [传统方案中的耦合逻辑](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [使用 MediatR 后的解耦架构](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [4 动手体验 MediatR](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [4.1 第一行代码(快速上手)](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [第一步:安装 NuGet 包](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [第二步:在 Program.cs 中注册 MediatR](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [第三步:编写第一个 Ping-Pong 消息](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [4.2 语法与模式详解](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [4.2.1 一对一模式(Request / Response)](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [4.2.2 一对多发布订阅模式(Notification)](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [4.2.3 管道行为(IPipelineBehavior)------ MediatR 的杀手级特性](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [经典案例:全局请求日志记录器](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [注册管道行为](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [5 总结](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [何时应该使用 MediatR?](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))
  • [避坑指南(小白使用建议)](# MediatR 入门指南:后端架构解耦 @[toc] 1 什么是 MediatR 1.1 概念讲解 1.2 类似的组件/设计模式对比 1.3 MediatR 在 .NET 生态中的发展历程 2 MediatR 代码与传统代码的对比 2.1 根据对比讲解 MediatR 的核心特点 传统代码风格 MediatR 代码风格 核心特点总结 2.2 MediatR 代码架构上的优势 2.3 帮助新手理解 MediatR 交互逻辑的方法 3 使用 MediatR 的意义 3.1 应用场景 3.2 维护性与扩展性的提升 3.3 通过案例讲解:用户注册逻辑演进 传统方案中的耦合逻辑 使用 MediatR 后的解耦架构 4 动手体验 MediatR 4.1 第一行代码(快速上手) 第一步:安装 NuGet 包 第二步:在 Program.cs 中注册 MediatR 第三步:编写第一个 Ping-Pong 消息 4.2 语法与模式详解 4.2.1 一对一模式(Request / Response) 4.2.2 一对多发布订阅模式(Notification) 4.2.3 管道行为(IPipelineBehavior)—— MediatR 的杀手级特性 经典案例:全局请求日志记录器 注册管道行为 5 总结 何时应该使用 MediatR? 避坑指南(小白使用建议))

1 什么是 MediatR

1.1 概念讲解

在日常生活中,如果机场里有几十架飞机同时准备起飞和降落,如果让飞行员们互相打电话协调:"小张你先降落,我等下再起飞",天空很快就会陷入混乱。

机场的解决方案是设置机场塔台(Control Tower):飞行员不与其他飞行员直接沟通,而是统一向塔台发消息("请求降落"),由塔台负责调度并通知相关人员。

MediatR 就是 .NET 开发中的"机场塔台"。它是一个非常轻量级(没有任何外部依赖)的开源库,实现了设计模式中的中介者模式(Mediator Pattern)

在传统的 C# 开发中,控制器(Controller)或服务(Service)往往需要直接依赖很多其他的 Service(比如邮件服务、日志服务、订单服务、库存服务)。而使用了 MediatR 后,组件之间不再直接"打电话"(方法调用),而是把请求打包成一个"消息对象"丢给 MediatR,由 MediatR 自动找到对应的处理逻辑。

复制代码
[传统方式]  Controller ----直接调用----> ServiceA, ServiceB, ServiceC...(网状依赖)
[MediatR]   Controller ----发送消息----> [MediatR 塔台] ----分发请求----> Handler(星型解耦)

1.2 类似的组件/设计模式对比

为了方便理解,我们可以将 MediatR 与几类常见的通信/解耦机制进行对比:

机制 / 技术 作用范围 适用场景 与 MediatR 的区别
直接依赖注入 (DI) 进程内 强耦合的通用工具服务 需要显式注入具体的 IService,服务多时构造函数极度臃肿。
MediatR 进程内 (In-Memory) 业务逻辑解耦、CQRS、横切关注点注入 只需要注入 IMediator,无需关心是谁处理了消息。仅限单个应用进程内。
观察者模式 (Observer) 进程内 事件监听 MediatR 的 Notification 机制就是进程内观察者模式的优雅封装。
消息队列 (RabbitMQ/Kafka) 跨进程 / 跨服务 分布式微服务解耦、异步削峰 涉及网络通信与分布式事务,复杂度高;而 MediatR 纯粹是内存中的方法调用传递。

一句话区分 :消息队列(MQ)用于不同服务器/微服务 之间的对话;MediatR 用于同一个项目内部不同代码块之间的解耦。

1.3 MediatR 在 .NET 生态中的发展历程

MediatR 由开源社区传奇作者 Jimmy Bogard(同时也是 AutoMapper 的作者)创建。

  • 早期阶段:为了解决传统 ASP.NET MVC/Web API 中 Controller 注入几十个 Service、业务逻辑臃肿不堪(Fat Controller)的问题。
  • CQRS 浪潮 :随着 CQRS(命令查询职责分离) 架构模式的流行,MediatR 凭借天生对 Request/ResponseNotification 的完美支持,成为了 .NET 生态中实现 CQRS 的事实标准(De Facto Standard)。
  • 现代发展 :如今 MediatR 已演化为支持 Pipeline Behaviors(管道行为) 的现代化框架,配合 .NET 的 Minimal API 和垂直切片架构(Vertical Slice Architecture),帮助开发者彻底摆脱了传统"Controller-Service-Repository"三层架构的机械束缚。

2 MediatR 代码与传统代码的对比

2.1 根据对比讲解 MediatR 的核心特点

我们以"用户下单"这个业务为例,看看代码结构的变化。

传统代码风格
csharp 复制代码
[ApiController]
[Route("[controller]")]
public class OrderController : ControllerBase
{
    private readonly OrderService _orderService;
    private readonly InventoryService _inventoryService;
    private readonly EmailService _emailService;
    private readonly AuditLogService _auditLogService;

    // 构造函数注入了一堆 Service,越来越庞大
    public OrderController(
        OrderService orderService, 
        InventoryService inventoryService, 
        EmailService emailService, 
        AuditLogService auditLogService)
    {
        _orderService = orderService;
        _inventoryService = inventoryService;
        _emailService = emailService;
        _auditLogService = auditLogService;
    }

    [HttpPost]
    public async Task<IActionResult> CreateOrder(CreateOrderDto dto)
    {
        // Controller 充当了"协调员",业务流程全部暴露在这里
        var orderId = await _orderService.CreateAsync(dto);
        await _inventoryService.DeductAsync(dto.ProductId, dto.Quantity);
        await _emailService.SendOrderConfirmationAsync(dto.UserId, orderId);
        await _auditLogService.LogAsync($"Order {orderId} created");
        
        return Ok(orderId);
    }
}
MediatR 代码风格
csharp 复制代码
[ApiController]
[Route("[controller]")]
public class OrderController : ControllerBase
{
    private readonly IMediator _mediator;

    // 永远只需要注入这一个中介者!
    public OrderController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpPost]
    public async Task<IActionResult> CreateOrder(CreateOrderCommand command)
    {
        // 扔出命令,剩下的事情由 MediatR 内部寻找 Handler 解决
        var orderId = await _mediator.Send(command);
        return Ok(orderId);
    }
}
核心特点总结
  1. 控制反转极致化:Controller 不再知道具体是谁处理了请求,也不关心有哪些副作用服务存在。
  2. 强类型数据包:业务入参和出参被高度封装为独立的 Command/Query/Event 类。
  3. 极简依赖:类的构造函数不再需要注入一长串服务接口。

2.2 MediatR 代码架构上的优势

  • 瘦 Controller / 瘦 API 终极方案:Controller 退化为纯粹的"协议转换层"(HTTP 请求 -> 转换成 Message -> 抛给 MediatR)。
  • 符合单一职责原则(SRP) :传统 OrderService 动辄上千行代码,包含几十个方法;而 MediatR 将每个业务操作(如"创建订单"、"取消订单")独立拆分为单独的 Handler 文件,改动 A 功能绝对不会影响 B 功能。
  • 极其优雅的单元测试:测试某个业务逻辑时,不再需要伪造(Mock)10 个依赖项,只需要构造指定的 Message 并测试其对应的单独 Handler 即可。

2.3 帮助新手理解 MediatR 交互逻辑的方法

如果感到抽象,你可以把 MediatR 理解为快递系统

复制代码
[寄件人] Send(Command) 
   │
   ▼
[快递柜 / 邮局] (MediatR 内部分发机制)
   │
   ▼
[派件员] Handler 接收并处理包裹,返回结果
  1. Message(信件/包裹):一个纯粹装载数据的 C# 类(POCO),描述"要做什么"或"发生了什么"。
  2. Sender(寄件人) :调用 _mediator.Send() 的地方(如 API Controller、后台任务)。
  3. Handler(收件人) :实现了 IRequestHandler 的类,专门负责执行具体的逻辑并输出结果。

3 使用 MediatR 的意义

3.1 应用场景

  1. 实现 CQRS 架构(命令查询职责分离)
  • 命令(Command):修改数据的操作(新增、更新、删除),通常返回简单标识或不返回。
  • 查询(Query) :读取数据的操作(列表、详情),只读不修改。
    MediatR 的 Request 机制能天然地把 Command 和 Query 拆分成独立文件。
  1. 垂直切片架构(Vertical Slice Architecture)
    不再按照层(Controller / Service / Repository)组织代码目录,而是按照功能特性(Feature)组织。例如 Features/Orders/CreateOrder.cs 内部同时放置 Request、Handler 和 Response,高内聚且极其易读。
  2. 横切关注点(AOP)集中处理
    所有业务请求都会经过 MediatR,因此可以在参数验证(FluentValidation)、日志记录、性能监控、事务处理等通用需求上,通过管道行为(Pipeline Behavior)进行统一拦截,无需在每个业务逻辑里重复写 try-catch 或日志代码。

3.2 维护性与扩展性的提升

当系统新增一个需求(例如:"用户下单成功后,发送 SMS 短信通知")时:

  • 传统做法 :找到 OrderService.cs,在其数百行代码的 CreateOrder 方法末尾追加注入 SmsService,并调用发送方法。每次修改核心 Service 都有破坏原有逻辑的风险。
  • MediatR 做法 :业务逻辑处理完后触发一个 OrderCreatedNotification 通知事件。新建一个 SendSmsHandler.cs 订阅该事件即可,完全零修改原有的创建订单逻辑,彻底贯彻"开闭原则(Open-Closed Principle)"。

3.3 通过案例讲解:用户注册逻辑演进

假设用户注册成功后需要执行三件事:

  1. 写入数据库
  2. 发送欢迎邮件
  3. 增加用户积分
传统方案中的耦合逻辑
csharp 复制代码
// 全部塞在一个 Service 里面,随着业务增加,类会无限膨胀
public class UserService
{
    public async Task RegisterUser(RegisterDto dto)
    {
        // 1. 写入数据库
        var user = new User { Name = dto.Name };
        await _db.Users.AddAsync(user);
        await _db.SaveChangesAsync();

        // 2. 发送邮件
        await _email.SendAsync(user.Email, "Welcome!");

        // 3. 增加积分
        await _points.AddPointsAsync(user.Id, 100);
    }
}
使用 MediatR 后的解耦架构
  1. 主流程只关注数据写入(Command):
csharp 复制代码
public record RegisterUserCommand(string Name, string Email) : IRequest<int>;

public class RegisterUserHandler : IRequestHandler<RegisterUserCommand, int>
{
    private readonly IMediator _mediator;
    private readonly AppDbContext _db;

    public RegisterUserHandler(IMediator mediator, AppDbContext db)
    {
        _mediator = mediator;
        _db = db;
    }

    public async Task<int> Handle(RegisterUserCommand request, CancellationToken cancellationToken)
    {
        // 1. 只负责主逻辑:写入数据库
        var user = new User { Name = request.Name, Email = request.Email };
        _db.Users.Add(user);
        await _db.SaveChangesAsync(cancellationToken);

        // 2. 发布"用户已注册"广播事件,不需要知道谁会响应它
        await _mediator.Publish(new UserRegisteredEvent(user.Id, user.Email), cancellationToken);

        return user.Id;
    }
}
  1. 其它副作用逻辑变成独立的"订阅者":
csharp 复制代码
// 事件定义
public record UserRegisteredEvent(int UserId, string Email) : INotification;

// 订阅者 1:发邮件
public class SendWelcomeEmailHandler : INotificationHandler<UserRegisteredEvent>
{
    public async Task Handle(UserRegisteredEvent notification, CancellationToken cancellationToken)
    {
        // 独立处理发邮件逻辑...
    }
}

// 订阅者 2:加积分
public class AddUserPointsHandler : INotificationHandler<UserRegisteredEvent>
{
    public async Task Handle(UserRegisteredEvent notification, CancellationToken cancellationToken)
    {
        // 独立处理积分逻辑...
    }
}

拆分后,每个类只有 10-20 行代码,职责无比清晰,未来若不需要加积分,直接删除或注释 AddUserPointsHandler.cs 文件即可,零风险!


4 动手体验 MediatR

4.1 第一行代码(快速上手)

在 .NET 8 / 9 项目中快速体验 MediatR 的最简流程:

第一步:安装 NuGet 包

通过终端或 Visual Studio 安装以下 NuGet 包:

bash 复制代码
dotnet add package MediatR
第二步:在 Program.cs 中注册 MediatR
csharp 复制代码
var builder = WebApplication.CreateBuilder(args);

// 自动扫描当前程序集(Assembly)中所有的 Handler 并注册到 DI 容器中
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));

var app = builder.Build();
第三步:编写第一个 Ping-Pong 消息
csharp 复制代码
using MediatR;
using Microsoft.AspNetCore.Mvc;

// 1. 定义 Request (请求消息)
public record PingQuery : IRequest<string>;

// 2. 定义 Handler (处理逻辑)
public class PingQueryHandler : IRequestHandler<PingQuery, string>
{
    public Task<string> Handle(PingQuery request, CancellationToken cancellationToken)
    {
        return Task.FromResult("Pong! 收到消息,MediatR 工作正常!");
    }
}

// 3. 在 Minimal API 中使用
app.MapGet("/ping", async (IMediator mediator) =>
{
    var result = await mediator.Send(new PingQuery());
    return Results.Ok(result);
});

app.Run();

4.2 语法与模式详解

MediatR 主要支持两种消息通讯模式,以及一种极其强大的切片拦截器。

4.2.1 一对一模式(Request / Response)

适用于要求同步返回结果的业务逻辑(如获取列表、创建一条记录)。

  • 消息接口IRequest<TResponse> (有返回值)或 IRequest (无返回值)。
  • 处理接口IRequestHandler<TRequest, TResponse>IRequestHandler<TRequest>
  • 发信方式await _mediator.Send(new MyRequest());
  • 规则 :一个 Request 必须且只能有一个对应的 Handler。如果有 0 个或多个 Handler,MediatR 会直接抛出异常。
csharp 复制代码
// 定义:根据 ID 查询商品详情
public record GetProductByIdQuery(int Id) : IRequest<ProductDto>;

public class GetProductByIdHandler : IRequestHandler<GetProductByIdQuery, ProductDto>
{
    public async Task<ProductDto> Handle(GetProductByIdQuery request, CancellationToken cancellationToken)
    {
        // 查询数据库并返回 ProductDto
        return new ProductDto(request.Id, "高性能笔记本电脑", 9999);
    }
}
4.2.2 一对多发布订阅模式(Notification)

适用于无需阻塞主流程的解耦事件(如日志记录、异步通知、刷新缓存)。

  • 消息接口INotification
  • 处理接口INotificationHandler<TNotification>
  • 发信方式await _mediator.Publish(new MyNotification());
  • 规则 :一个 Notification 可以有 0 个、1 个或多个 Handler。所有的 Handler 都会被依次或并行执行。
csharp 复制代码
// 定义:订单支付完成事件
public record OrderPaidEvent(int OrderId, decimal Amount) : INotification;

// 处理者 A:修改订单状态
public class UpdateOrderStatusHandler : INotificationHandler<OrderPaidEvent>
{
    public Task Handle(OrderPaidEvent notification, CancellationToken cancellationToken)
    {
        // 执行数据库更新...
        return Task.CompletedTask;
    }
}

// 处理者 B:给用户发推送通知
public class PushNotificationHandler : INotificationHandler<OrderPaidEvent>
{
    public Task Handle(OrderPaidEvent notification, CancellationToken cancellationToken)
    {
        // 调用第三方推送服务...
        return Task.CompletedTask;
    }
}
4.2.3 管道行为(IPipelineBehavior)------ MediatR 的杀手级特性

Pipeline Behavior 类似于 ASP.NET Core 中的"中间件(Middleware)",但它是作用在 MediatR 消息执行前后 的。

它可以拦截每一个通过 _mediator.Send() 发出的请求,在处理前和处理后加入通用逻辑。

经典案例:全局请求日志记录器

无需在每个 Handler 里写日志,只需写这一个管道:

csharp 复制代码
public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
    where TRequest : notnull
{
    private readonly ILogger<LoggingBehavior<TRequest, TResponse>> _logger;

    public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> logger)
    {
        _logger = logger;
    }

    public async Task<TResponse> Handle(
        TRequest request, 
        RequestHandlerDelegate<TResponse> next, 
        CancellationToken cancellationToken)
    {
        var requestName = typeof(TRequest).Name;

        // 1. 请求处理前的逻辑
        _logger.LogInformation("--> 开始处理请求: {Name}, 参数: {@Request}", requestName, request);

        var timer = System.Diagnostics.Stopwatch.StartNew();

        // 2. 调用 next() 继续执行下一个 Behavior 或真正的 Handler
        var response = await next();

        timer.Stop();

        // 3. 请求处理后的逻辑
        _logger.LogInformation("<-- 请求处理完成: {Name}, 耗时: {Elapsed} ms", requestName, timer.ElapsedMilliseconds);

        return response;
    }
}
注册管道行为

Program.cs 中添加配置:

csharp 复制代码
builder.Services.AddMediatR(cfg => {
    cfg.RegisterServicesFromAssembly(typeof(Program).Assembly);
    
    // 注册全局管道行为
    cfg.AddOpenBehavior(typeof(LoggingBehavior<,>));
});

只要配置了这几行代码,系统中所有的 Request 请求在被执行时,都会自动打印入参、出参和执行耗时!


5 总结

MediatR 不是解决特定业务算法的"炫技工具",而是一个帮助我们规避代码腐化、重构系统架构的利器。

何时应该使用 MediatR?

  • 项目业务逻辑复杂,Controller 或 Service 逐渐变得臃肿且难以维护。
  • 团队正在尝试落地 CQRS垂直切片架构
  • 系统中有大量的横切关注点(如全局日志、参数验证、事务控制、异常拦截)需要统一优雅管理。
  • 存在大量"主流程执行完后需要触发一连串次要操作"的业务场景。

避坑指南(小白使用建议)

  1. 不要盲目为了用而用:如果一个简单的 CRUD 项目只有两三个接口,直接写 Controller/Service 即可,引入 MediatR 反而会多创建很多 Command 和 Handler 文件。
  2. 警惕"隐式追踪"困难:由于取消了直接的方法引用,在 IDE 中按 F12(Go to Definition)可能无法直接跳转到 Handler,需要适应查找实现类(F12 -> Find Implementations)的操作习惯。
  3. 保持 Handler 干净:Handler 本身应该足够轻量,复杂的领域算法依然可以下沉到 Domain Model(领域模型)中,不要把 Handler 又写成了另一个"巨型 Service"。

通过引入 MediatR,你的 C# 代码将从臃肿纠缠的"意面架构",蜕变为模块分明、职责清晰、易于扩展的现代优雅架构。

相关推荐
人间凡尔赛2 小时前
Kubernetes十周年:从Cloud Native到AI Native的架构范式跃迁
后端·云原生·架构
一个天蝎座 白勺 程序猿2 小时前
MongoDB迁移新范式|从烟囱式孤岛到KES-AI融合架构
人工智能·mongodb·架构·kingbasees
回忆2012初秋2 小时前
C# 中的 EAP:基于事件的异步编程全面指南(一)
开发语言·c#
John jj2 小时前
拆解 Telegram 群组频道收录市场:三类方案,一个可运行的评分模型,目前TG中文人工评分加模型评分机制——LetsTG收录“快速”、“无门槛”
大数据·后端·python·深度学习·搜索引擎·django·全文检索
AI 小老六2 小时前
Agent Runtime 如何用 Session、Memory、User Profile 和 Skill 实现外部学习
服务器·人工智能·学习·ai·架构·自动化
程序边界2 小时前
从烟囱到融合:一次MongoDB迁移引发的架构重构深思
mongodb·重构·架构
Asize2 小时前
无状态 Stateless:大模型为什么记不住你是谁
javascript·人工智能·架构
Boop_wu2 小时前
SpringBoot 集成阿里云短信认证服务(个人)
spring boot·后端·阿里云
Gopher_HBo3 小时前
Engine 核心(gin.go)
后端