什么是 MediatR,为什么需要它?
MediatR 是一个轻量级但功能强大的 .NET 库,实现了 中介者(Mediator) 设计模式。在软件开发领域,尤其是在基于 CQRS(命令查询职责分离)架构构建的应用程序中,MediatR 已成为事实上的标准。
为什么需要它?
在经典架构中,当一个类(例如控制器)想要在另一个类(例如服务)中执行操作时,它必须知道该服务的存在及其接口。这会产生紧耦合(tight coupling)。如果您想在调用服务之前添加日志记录、验证或缓存,则必须修改控制器代码或创建装饰器,这会使维护变得复杂。
MediatR 通过引入中介者的概念解决了这个问题。系统组件(例如控制器)不再直接通信。相反,它们通过 MediatR 发送请求(Request)或命令(Command)。该库会自动查找并调用相应的处理程序(Handler)。
使用 MediatR 的主要优势:
- 松耦合(Loose Coupling): 请求发送者完全不了解接收者。它只知道请求的类型。
- 单一职责原则(SRP): 每个处理程序只负责一个操作(例如,“创建用户”、“获取订单列表”)。
- 简化 CQRS: MediatR 非常适合分离命令(改变状态)和查询(读取状态)。
- 管道行为(Pipeline Behaviors): 您可以轻松添加横切关注点功能(日志记录、验证、事务),而无需修改处理程序代码。
- 可测试性: 可以轻松地隔离测试处理程序,并且可以轻松替换其实现。
安装 MediatR
MediatR 通过 NuGet 分发。可以通过以下几种方式安装:
1. 通过 .NET CLI(推荐方式)
在项目根目录打开终端并执行以下命令:
dotnet add package MediatR如果您使用 ASP.NET Core,还需要用于依赖注入(DI)的包:
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection2. 通过 Package Manager Console(Visual Studio)
Install-Package MediatRInstall-Package MediatR.Extensions.Microsoft.DependencyInjection3. 通过 NuGet Package Manager UI
在 Visual Studio 中:工具 → NuGet 包管理器 → 管理解决方案的 NuGet 程序包...。搜索“MediatR”并安装这两个包。
快速入门与代码示例
让我们创建一个简单的示例:向用户发送问候。
步骤 1:创建项目
创建一个新的控制台项目或 ASP.NET Core Web API 项目。
步骤 2:定义请求(Request)
创建一个表示请求的类。它必须实现 IRequest<TResponse> 接口,其中 TResponse 是返回值的类型。
using MediatR;
public class PingRequest : IRequest<string>{ public string Message { get; set; } = "Ping";}步骤 3:创建处理程序(Handler)
创建一个实现 IRequestHandler<TRequest, TResponse> 接口的类。
using MediatR;using System.Threading;using System.Threading.Tasks;
public class PingHandler : IRequestHandler<PingRequest, string>{ public Task<string