MediatR实现高效信息传递,以.net8做demo演示

news/2024/11/15 7:17:15/文章来源:https://www.cnblogs.com/chenshibao/p/18393289

MediatR 是 .NET 下的一个实现消息传递的库,轻量级、简洁高效,用于实现进程内的消息传递机制。它基于中介者设计模式,支持请求/响应、命令、查询、通知和事件等多种消息传递模式。通过泛型支持,MediatR 可以智能地调度不同类型的消息,非常适合用于领域事件处理。

我们将定义一个命令、一个处理器以及一个用于发送命令的服务,演示如何发送一个命令并处理它。

1.创建.NET 8 WebAPI 标准项目,选择启用 OpenAPI 支持和使用控制器;

image
引用 MediatR 包到项目中。

2.具体实现

2.1 注册MediatR
在 Program.cs 文件中,我们需要注册 MediatR 服务。
image
2.2 创建通知类
在项目中定义了一个简单的通知类 InfoDemo,它是 INotification 接口的实现。
image

记录类型是一种特殊的类,主要用于表示不可变的数据类型,并提供了默认的实现来简化对象的创建和比较。

public record InformationDemo(string Msg):这里定义了一个名为 InformationDemo 的记录类型,它接受一个字符串类型的构造函数参数 Msg。这个参数将会成为 InformationDemo 类的一个只读属性。
INotification:这里指定了 InfoDemo 类实现了 INotification 接口。在 MediatR 中,INotification 接口用于标记一个类型作为通知(Notification)处理,这意味着这个类型将用于发送通知而不需要等待响应。

2.3 创建处理器类
创建一个通知处理器类 InformationDemoHandler,用于处理通知并返回响应。
它是 INotificationHandler 接口的实现。
它接受一个 ILogger 类型的构造函数参数 _logger,并实现了 INotificationHandler 接口。INotificationHandler 接口是 MediatR 提供的接口,用于处理 T 类型的通知。
image

这段代码实现了 INotificationHandler 接口,并在 Handle 方法中处理 InformationDemo 类型的通知。
当 MediatR 接收到 InformationDemo 类型的通知时,它会调用 InformationDemoHandler 的 Handle 方法来处理该通知。

2.4 创建控制器类

[ApiController]
[Route("[controller]")]
public class MediatorDemoController : ControllerBase
{
private readonly IMediator mediator;
private readonly ILogger _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 InformationDemo("Mediator 控制器消息 ");mediator.Publish(information);_logger.LogInformation($"{DateTimeOffset.Now} : MediatorDemoController Send: {information}.");return $"Ok";}}

3.运行展示

启动 ASP.NET Core 应用程序,通过swgger调用方法MediatorDemoMethod,可以看到消息通知和日志记录

image

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

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

相关文章

Redis组件介绍(五)

今天继续学习redis后面的知识。写在前面 今天继续学习redis后面的知识。 Redis 哨兵机制 哨兵 Sentinel 机制 Sentinel(哨兵)是 Redis 的高可用性解决方案。由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器。当…

人工智能的动漫虚拟世界(第二代)游戏、游戏源码、教程(三合一)

人工智能的动漫虚拟世界(第二代)游戏、游戏源码、教程(三合一)。我不想跟任何人说话,任何人不要跟我说话,我要安安静静的写。 2024年9月2日第二代制作完成,现在就比较象样了。 男主角换人了,黑头发的。 男女主角有个完善的家了,是小区场景中,一栋二层的小楼。 之前,…

JeecgBoot积木报表AviatorScript表达式注入漏洞复现

漏洞信息 影响组件:JimuReport积木报表 影响版本:v1.6.0 < JimuReport ≤ 1.7.8 漏洞名称:AviatorScript表达式注入漏洞 漏洞链接:积木报表软件存在AviatorScript代码注入RCE漏洞 Issue #2848 漏洞描述: 积木报表软件存在AviatorScript代码注入RCE漏洞 使用接口/jmrepo…

flash详解

flash详解 什么是Flash Flash全名叫做Flash Memory,从名字就能看出,是种数据存储设备,存储设备有很多类,Flash属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。关于什么是非易失性/易失性,从名字中就可以看出,…

Dll 可执行文件的编写与调用

一、Dll 可执行文件的编写 首先我们需要在 VS 创建一个动态链接库(DLL)项目,然后会生成如下代码: // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h"BOOL APIENTRY DllMain( HMODULE hModule, // 指向 Dll 模块的句柄DWORD ul_reason_for_call, /…

rabbitmq高可用集群搭建

需求分析基本情况 在进行RabbitMQ搭建时,我们基于现有的连接数据和业务需求进行了深入分析。目前的统计数据显示,连接数为631,队列数为80418。为了确保业务需求的顺利满足,我们需要在云产品和自建RabbitMQ消息队列服务之间做出选择。 经过比较发现,即使选择腾讯云的最高规…

谈谈springboot中@Conditional相关注解

@Conditional是一个元注解@ConditionalOnClass(xx.class) 这是用于修饰一个类的注解。它主要是让你的代码具有兼容性,如在多模块下common模块中有一些仅仅是部分其他模块依赖、需要配置的类(例如rabbitMQ配置类,我相信他不应该被全模块需要,但是他放在常用模块中依旧是最合…

Categraf+VictoriaMetrics+Grafana网络设备监控方案

背景 应公司网工邀请,一起研究架设一套系统,对公司网络设备进行监控和预警。 基础 什么是SNMP 简单网络管理协议SNMP(Simple Network Management Protocol)用于网络设备的管理。 网络设备多种多样,不同设备不同厂家管理接口各不相同,于是snmp应运而生,SNMP作为广泛应用于…

Categraf+VictoriaMetrics+Grafana,网络设备监控方案

背景 应公司网工邀请,一起研究架设一套系统,对公司网络设备进行监控和预警。 基础 什么是SNMP 简单网络管理协议SNMP(Simple Network Management Protocol)用于网络设备的管理。 网络设备多种多样,不同设备不同厂家管理接口各不相同,于是snmp应运而生,SNMP作为广泛应用于…

Kubernetes存储卷

1. 存储卷基础 1.1 存储卷基础 从概念上讲,存储卷是可供Pod中的所有容器访问的目录Pod规范中声明的存储卷来源决定了目录的创建方式、使用的存储介质以及目录的初始内容存储卷插件(存储驱动)决定了支持的后端存储介质或存储服务,例如hostPath插件使用宿主机文件系统,而nfs…

一场 Kafka CRC 异常引发的血案

一、问题概述 客户的生产环境突然在近期间歇式的收到了Kafka CRC的相关异常,异常内容如下 Record batch for partition skywalking-traces-0 at offset 292107075 is invalid, cause: Record is corrupt (stored crc = 1016021496, compute crc = 1981017560) 报错没有规律性,…