.NET 8 中利用 MediatR 实现高效消息传递
前言MediatR 是 .NET 下的一个实现消息传递的库,轻量级、简洁高效,用于实现历程内的消息传递机制。它基于中介者设计模式,支持请求/响应、命令、查询、通知和事件等多种消息传递模式。通过泛型支持,MediatR 可以智能地调度不同类型的消息,非常得当用于领域事件处理。
在本文中,将通过一个简单的示例来介绍怎样使用 MediatR 库在 .NET 8 项目中处理命令。我们将定义一个命令、一个处理器以及一个用于发送命令的服务,演示怎样发送一个命令并处理它。
预备工作
1、创建项目
创建一个新的 .NET 8 WebAPI 尺度项目,选择启用 OpenAPI 支持和使用控制器;
dotnet new webapi -n ManageCore.MediatrDemo
cd ManageCore.MediatrDemo
2、添加 MediatR 包
使用以下命令添加 MediatR 包到项目中。
dotnet add package MediatR<img alt="">https://img2024.cnblogs.com/blog/576536/202408/576536-20240813175505665-1365471471.png
实现示例
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 接口的实现。
它接受一个 ILogger 类型的构造函数参数 _logger,并实现了 INotificationHandler 接口。INotificationHandler 接口是 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 接口,并在 Handle 方法中处理 InfoDemo 类型的通知。
当 MediatR 接收到 InfoDemo 类型的通知时,它会调用 InfoDemoHandler 的 Handle 方法来处理该通知。
4、创建控制器类
定义一个名为 MediatorDemoController 的 ASP.NET Core 控制器,使用 MediatR 发布通知。
using MediatR;
using Microsoft.AspNetCore.Mvc;
namespace ManageCore.MediatrDemo.Controllers
{
")]
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>
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依靠项。
2、访问控制器方法
通过访问 /MediatorDemo的 GET 请求来调用MediatorDemoMethod方法。
3、创建并发布通知
在MediatorDemoMethod 方法中,创建一个InfoDemo 类型的通知实例,并通过mediator.Publish(information) 发布该通知。
4、处理通知
当通知被发布时,全部实现了INotificationHandler接口的处理器都会被调用来处理通知。
InfoDemoHandler 处理器会接收到通知,并通过日志纪录器纪录一条日志,显示接收到的通知及其时间戳。
5、纪录日志
在控制器中,通过_logger.LogInformation纪录一条日志,显示发送的通知及其时间戳。
6、返回响应
控制器方法返回"Ok"字符串,表现执行乐成。
7、预期结果
https://img2024.cnblogs.com/blog/576536/202408/576536-20240813175434763-152785086.png
<img alt="">总结
通过这个简单的示例,可以在 .NET 8 应用程序中使用 MediatR 库来发布和处理通知,实现历程内的消息传递。这种方法有助于解耦组件,并使得应用程序更加模块化和可维护。示例不仅分析白怎样使用 MediatR 来处理通知,还分析白怎样实现通知处理模式。通过定义通知和处理器,我们可以将应用程序的不同部分解耦,使得代码更加清晰和易于维护。
末了
如果你以为这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继承分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号 社区,与其他热爱技术的同行一起交换心得,共同发展!
https://img2024.cnblogs.com/blog/576536/202408/576536-20240814104247047-372270705.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]