
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/Response和Notification的完美支持,成为了 .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);
}
}
核心特点总结
- 控制反转极致化:Controller 不再知道具体是谁处理了请求,也不关心有哪些副作用服务存在。
- 强类型数据包:业务入参和出参被高度封装为独立的 Command/Query/Event 类。
- 极简依赖:类的构造函数不再需要注入一长串服务接口。
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 接收并处理包裹,返回结果
- Message(信件/包裹):一个纯粹装载数据的 C# 类(POCO),描述"要做什么"或"发生了什么"。
- Sender(寄件人) :调用
_mediator.Send()的地方(如 API Controller、后台任务)。 - Handler(收件人) :实现了
IRequestHandler的类,专门负责执行具体的逻辑并输出结果。
3 使用 MediatR 的意义
3.1 应用场景
- 实现 CQRS 架构(命令查询职责分离)
- 命令(Command):修改数据的操作(新增、更新、删除),通常返回简单标识或不返回。
- 查询(Query) :读取数据的操作(列表、详情),只读不修改。
MediatR 的 Request 机制能天然地把 Command 和 Query 拆分成独立文件。
- 垂直切片架构(Vertical Slice Architecture)
不再按照层(Controller / Service / Repository)组织代码目录,而是按照功能特性(Feature)组织。例如Features/Orders/CreateOrder.cs内部同时放置 Request、Handler 和 Response,高内聚且极其易读。 - 横切关注点(AOP)集中处理
所有业务请求都会经过 MediatR,因此可以在参数验证(FluentValidation)、日志记录、性能监控、事务处理等通用需求上,通过管道行为(Pipeline Behavior)进行统一拦截,无需在每个业务逻辑里重复写try-catch或日志代码。
3.2 维护性与扩展性的提升
当系统新增一个需求(例如:"用户下单成功后,发送 SMS 短信通知")时:
- 传统做法 :找到
OrderService.cs,在其数百行代码的CreateOrder方法末尾追加注入SmsService,并调用发送方法。每次修改核心 Service 都有破坏原有逻辑的风险。 - MediatR 做法 :业务逻辑处理完后触发一个
OrderCreatedNotification通知事件。新建一个SendSmsHandler.cs订阅该事件即可,完全零修改原有的创建订单逻辑,彻底贯彻"开闭原则(Open-Closed Principle)"。
3.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 后的解耦架构
- 主流程只关注数据写入(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;
}
}
- 其它副作用逻辑变成独立的"订阅者":
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 或 垂直切片架构。
- 系统中有大量的横切关注点(如全局日志、参数验证、事务控制、异常拦截)需要统一优雅管理。
- 存在大量"主流程执行完后需要触发一连串次要操作"的业务场景。
避坑指南(小白使用建议)
- 不要盲目为了用而用:如果一个简单的 CRUD 项目只有两三个接口,直接写 Controller/Service 即可,引入 MediatR 反而会多创建很多 Command 和 Handler 文件。
- 警惕"隐式追踪"困难:由于取消了直接的方法引用,在 IDE 中按 F12(Go to Definition)可能无法直接跳转到 Handler,需要适应查找实现类(F12 -> Find Implementations)的操作习惯。
- 保持 Handler 干净:Handler 本身应该足够轻量,复杂的领域算法依然可以下沉到 Domain Model(领域模型)中,不要把 Handler 又写成了另一个"巨型 Service"。
通过引入 MediatR,你的 C# 代码将从臃肿纠缠的"意面架构",蜕变为模块分明、职责清晰、易于扩展的现代优雅架构。