.NET 8 中利用 MediatR 实现高效消息传递

news/2024/9/19 15:50:54/文章来源:https://www.cnblogs.com/1312mn/p/18357288

前言

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,用于携带消息文本。这个类可以被用来发送通知,而不期待任何响应或结果。在实际应用中,你可能会使用 MediatRIMediator 接口来发送这种通知,并由其他组件来处理这些通知。

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 类型的通知时,它会调用 InfoDemoHandlerHandle 方法来处理该通知。

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控制器将被注册,并且构造函数将被调用来注入IMediatorILogger<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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/783637.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThrottleStop tpl 无法解锁功耗墙 原因

https://www.ibmnb.com/thread-2041588-1-1.html 1. 主界面设置不要勾选Disable-Turbo / BD-PROCHOT (不然后面的TPL,FIVR配置可能不起作用的)需要勾选Speed-shift EPP (用内置频率管理, 128默认就可以)SpeedStep 也勾上(提升响应速度)选择Pefermance性能模式(下面具体FL…

读零信任网络:在不可信网络中构建安全系统18零信任代理

零信任代理1. 零信任代理 1.1. 零信任代理是应用级代理服务器,用来保护零信任网络,它是处理认证、授权以及加密的基础设施 1.2. 零信任代理分为反向代理和前向代理两种工作模式1.2.1. 运行时可以同时采用这两种工作模式,也可以只采用其中的一种1.2.2. 在反向代理工作模式下,…

centos7 下安装运行 docker-jitsi-meet stable-9646 版本

1 安装docker:2 3 yum install -y yum-utils device-mapper-persistent-data lvm24 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo5 yum install docker-ce6 7 docker --version8 9 systemctl st…

什么是外卖霸王餐项目,怎么运营霸王餐平台

在当今快节奏的社会中,外卖行业如火如荼,不仅为消费者提供了便捷的就餐方式,也为商家开辟了新的市场渠道。在这样的背景下,“外卖霸王餐项目”逐渐走进了公众视野,成为商家吸引顾客、提升品牌知名度的一种创新营销手段。那么,什么是外卖霸王餐项目?又如何做好其运营呢?…

PbootCMS后台关闭验证码,登录提示验证码不能空的解决方法

PbootCMS后台关闭验证码,登录提示验证码不能空的解决方法apps/admin/controller/IndexController.php 大概在126行 if (!$checkcode) {json(0, 验证码不能为空!); } 改成 if (!$checkcode && $this->config(admin_check_code)) {json(0, 验证码不能为空!); }扫码…

CAD二次开发入门:WPF类库

参考学习视频:https://www.bilibili.com/video/BV16Y411v7kr/?spm_id_from=333.337.search-card.all.click&vd_source=fbb64ea20b269b753497bf6c2499fc29第一步:创建WPF类库,并写CAD调用方法 main页面添加以下内容:<Grid><Button Height="50" Clic…

Mac下go安装

https://go.dev/dl/ 查看是arm64,还是x86-64命令: -uname -a 我的是 Darwin okerdeMacBook-Pro.local 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:13:18 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6030 arm64安装后,重新打开终端

GreatSQL 并行Load Data加快数据导入

GreatSQL 并行Load Data加快数据导入 数据库信息 数据库版本:GreatSQL 8.0.32-25 Clickhouse表需要导入到 GreatSQL 中,表数据量庞大所以选用导出CSV的方式。 测试数据复现操作 load data MySQL load data 语句能快速将一个文本文件的内容导入到对应的数据库表中(一般文本的一…

DeiT-LT:印度科学院提出针对长尾数据的`DeiT`升级模型 | CVPR 2024

DeiT-LT为ViT在长尾数据集上的应用,通过蒸馏DIST标记引入CNN知识,以及使用分布外图像并重新加权蒸馏损失来增强对尾类的关注。此外,为了减轻过拟合,论文建议用经过SAM训练的CNN教师进行蒸馏,促使所有ViT块中DIST标记学习低秩泛化特征。经过DeiT-LT的训练方案,DIST标记成为…

博客建站4 - ssh远程连接服务器

1. 什么是SSH? 2. 下载shh客户端 3. 配置ssh密钥 4. 连接服务器 5. 常见问题5.1. IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!1. 什么是SSH? SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络中安全地远程登录到其他计算机系统。它提供了对远程服务…

H7-TOOL混合脱机烧录以及1拖4不同的通道烧录不同的程序操作说明(2024-08-07)

【应用场景】 原本TOOL的1拖4是用于同时烧录相同程序给目标板,但有时候一个板子上有多个不同的MCU,客户希望仅通过一个TOOL就可以完成对板子上多个MCU的烧录,也就是1拖4不同的通道烧录不同的程序,此贴为此制作。【实验目标】由于这个属于定制需求,需要简单修下目标文件,后…

英智大模型推理API:免费让Llama 3.1成为您创新项目的强力后盾

“免费版(Llama3.1 扩展包)”是英智大模型推理 API 服务平台面向开发者推出的 Llama3.1 免费套餐,供广大开发者无门槛、不限制 Tokens、永久使用,每位用户限购 1 次。 包含服务: “英智 Llama3.1 服务”:QPS(每秒查询数)限制为 1 次,统计 Tokens。 立即免费使用Llama3…