MediatR一个优秀的.NET中介者框架
1 前置阅读
在阅读本文章之前,你可以先阅读:
- 什么是中介者模式
2 简介
.NET中的简单中介者模式实现,一种进程内消息传递机制(无其他外部依赖)。 支持以同步或异步的形式进行请求/响应,命令,查询,通知和事件的消息传递,并通过C#泛型支持消息的智能调度。
MediatR可以支持几种模式:请求/响应模式与发布模式。
3 请求/响应模式的使用
请求/响应模式,也可以叫做命令模式,是一对一的消息传递,一个消息对应一个消息处理。
首先,将MediatR,MediatR.Extensions.Microsoft.DependencyInjection的NuGet软件包安装到您的应用程序中。
MediatR
MediatR.Extensions.Microsoft.DependencyInjection
然后,我们通过Startup.ConfigureServices增加AddMediatR来注册组件。
services.AddMediatR(typeof(TenantRequestHandler).Assembly);
接着,定义消息类。
namespace MediatR.WebApi
{
public class TenantRequest : IRequest<string>
{
public TenantRequest(string message)
{
Message = message;
}
public string Message { get; }
}
}
接着,定义消息处理类。
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace MediatR.WebApi
{
public class TenantRequestHandler : IRequestHandler<TenantRequest, string>
{
private readonly ILogger<TenantRequestHandler> logger;
public TenantRequestHandler(ILogger<TenantRequestHandler> logger)
{
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public Task<string> Handle(TenantRequest request, CancellationToken cancellationToken)
{
logger.LogInformation($"Handled: {request.Message}");
return Task.FromResult(request.Message);
}
}
}
最后,创建HomeController,发布请求
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
namespace MediatR.WebApi.Controllers
{
[Route("[controller]")]
[ApiController]
public class HomeController : Controller
{
private readonly IMediator mediator;
public HomeController(IMediator mediator)
{
this.mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
}
[Route("Example01")]
[HttpGet]
public async Task<IActionResult> Example01()
{
await mediator.Send(new TenantRequest { Message= "通知房客信息" });
return Ok();
}
}
}
项目中跟踪会输出:
Handled: 通知房客信息
4 发布模式的使用
发布模式,是一对多的消息传递,一个消息对应多个消息处理。
安装及注册组件后,首先,定义消息类。
namespace MediatR.WebApi
{
public class LandlordNotification : INotification
{
public LandlordNotification(string message)
{
Message = message;
}
public string Message { get; }
}
}
接着,定义消息处理类。
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace MediatR.WebApi
{
public class LandlordNotificationHandler : INotificationHandler<LandlordNotification>
{
private readonly ILogger<LandlordNotificationHandler> logger;
public LandlordNotificationHandler(ILogger<LandlordNotificationHandler> logger)
{
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public Task Handle(LandlordNotification notification, CancellationToken cancellationToken)
{
logger.LogInformation($"Handled: {notification.Message}");
return Task.CompletedTask;
}
}
}
最后,在HomeController,增加发布请求
[Route("Example02")]
[HttpGet]
public async Task<IActionResult> Example02()
{
await mediator.Publish(new LandlordNotification("通知房东信息"));
return Ok();
}
项目中跟踪会输出:
Handled: 通知房东信息
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)