首页 > 极客资料 博客日记
.NET 8 中利用 MediatR 实现高效消息传递
2024-08-14 11:00:06极客资料围观24次
前言
MediatR 是 .NET 下的一个实现消息传递的库,轻量级、简洁高效,用于实现进程内的消息传递机制。它基于中介者设计模式,支持请求/响应、命令、查询、通知和事件等多种消息传递模式。通过泛型支持,MediatR 可以智能地调度不同类型的消息,非常适合用于领域事件处理。
在本文中,将通过一个简单的示例来介绍如何使用 MediatR 库在 .NET 8 项目中处理命令。我们将定义一个命令、一个处理器以及一个用于发送命令的服务,演示如何发送一个命令并处理它。
准备工作
1、创建项目
创建一个新的 .NET 8 WebAPI 标准项目,选择启用 OpenAPI 支持和使用控制器;
dotnet new console -n ManageCore.MediatrDemo cd ManageCore.MediatrDemo
2、添加 MediatR 包
使用以下命令添加 MediatR 包到项目中。
dotnet add package MediatR
实现示例
1、注册 MediatR
在 Program.cs
文件中,我们需要注册 MediatR 服务。
// Add services to the container. builder.Services.AddMediatR(mr =>{ mr.RegisterServicesFromAssembly(typeof(Program).Assembly); });
2、创建通知类
在项目中定义了一个简单的通知类 InfoDemo
,它是 INotification
接口的实现。
using MediatR; namespace ManageCore.MediatrDemo { public record InfoDemo(string Msg) : INotification; }
首先声明了一个名为 InfoDemo
的记录类型(record type)。
记录类型是一种特殊的类,主要用于表示不可变的数据类型,并提供了默认的实现来简化对象的创建和比较。
public record InfoDemo(string Msg)
:这里定义了一个名为InfoDemo
的记录类型,它接受一个字符串类型的构造函数参数Msg
。这个参数将会成为InfoDemo
类的一个只读属性。: INotification
:这里指定了InfoDemo
类实现了INotification
接口。在MediatR
中,INotification
接口用于标记一个类型作为通知(Notification)处理,这意味着这个类型将用于发送通知而不需要等待响应。
注意:这段代码定义了一个名为 InfoDemo
的通知类,它包含一个只读属性 Msg
,用于携带消息文本。这个类可以被用来发送通知,而不期待任何响应或结果。在实际应用中,你可能会使用 MediatR
的 IMediator
接口来发送这种通知,并由其他组件来处理这些通知。
3、创建处理器类
创建一个通知处理器类 InfoDemoHandler
,用于处理通知并返回响应。
它是 INotificationHandler<InfoDemo>
接口的实现。
它接受一个 ILogger<InfoDemoHandler>
类型的构造函数参数 _logger
,并实现了 INotificationHandler<InfoDemo>
接口。INotificationHandler<T>
接口是 MediatR
提供的接口,用于处理 T
类型的通知。
using MediatR; namespace ManageCore.MediatrDemo { /// <summary> /// 通知处理器类 /// </summary> /// <param name="_logger"></param> public class InfoDemoHandler(ILogger<InfoDemoHandler> _logger) : INotificationHandler<InfoDemo> { /// <summary> /// /// </summary> /// <param name="notification"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public Task Handle(InfoDemo notification, CancellationToken cancellationToken) { _logger.LogInformation($"InfoDemoHandler Received: {notification}. {DateTimeOffset.Now}"); return Task.CompletedTask; } } }
这段代码实现了 INotificationHandler<InfoDemo>
接口,并在 Handle
方法中处理 InfoDemo
类型的通知。
当 MediatR
接收到 InfoDemo
类型的通知时,它会调用 InfoDemoHandler
的 Handle
方法来处理该通知。
4、创建控制器类
定义一个名为 MediatorDemoController
的 ASP.NET Core 控制器,使用 MediatR
发布通知。
using MediatR; using Microsoft.AspNetCore.Mvc; namespace ManageCore.MediatrDemo.Controllers { [ApiController] [Route("[controller]")] public class MediatorDemoController : ControllerBase { private readonly IMediator mediator; private readonly ILogger<MediatorDemoController> _logger; /// <summary> ///初始化 /// </summary> /// <param name="mediator"></param> /// <param name="logger"></param> public MediatorDemoController(IMediator mediator, ILogger<MediatorDemoController> logger) { this.mediator = mediator; _logger = logger; } /// <summary> /// MediatorDemo 方法 /// </summary> /// <returns></returns> [HttpGet(Name = "MediatorDemoMethod")] public string MediatorDemoMethod() { var information = new InfoDemo("Mediator 控制器消息 "); mediator.Publish(information); _logger.LogInformation($"{DateTimeOffset.Now} : MediatorDemoController Send: {information}."); return $"Ok"; } } }
说明:这段代码定义了一个名为MediatorDemoController
的控制器类,它使用 MediatR
发布了一个名为InfoDemo
的通知。当调用MediatorDemoMethod
方法时,它会创建一个InfoDemo
类型的通知实例,通过mediator
发布该通知,并记录一条日志。
运行示例
1、启动 ASP.NET Core 应用程序
启动应用程序后MediatorDemoController
控制器将被注册,并且构造函数将被调用来注入IMediator
和ILogger<MediatorDemoController>
依赖项。
2、访问控制器方法
通过访问 /MediatorDemo
的 GET 请求来调用MediatorDemoMethod
方法。
3、创建并发布通知
在MediatorDemoMethod
方法中,创建一个InfoDemo
类型的通知实例,并通过mediator.Publish(information)
发布该通知。
4、处理通知
当通知被发布时,所有实现了INotificationHandler<InfoDemo>
接口的处理器都会被调用来处理通知。
InfoDemoHandler
处理器会接收到通知,并通过日志记录器记录一条日志,显示接收到的通知及其时间戳。
5、记录日志
在控制器中,通过_logger.LogInformation
记录一条日志,显示发送的通知及其时间戳。
6、返回响应
控制器方法返回"Ok"
字符串,表示执行成功。
7、预期结果
总结
通过这个简单的示例,可以在 .NET 8 应用程序中使用 MediatR
库来发布和处理通知,实现进程内的消息传递。这种方法有助于解耦组件,并使得应用程序更加模块化和可维护。示例不仅说明了如何使用 MediatR
来处理通知,还说明了如何实现通知处理模式。通过定义通知和处理器,我们可以将应用程序的不同部分解耦,使得代码更加清晰和易于维护。
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”