首页 > 其他分享 >.NET 8 中利用 MediatR 实现高效消息传递

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

时间:2024-08-14 10:38:01浏览次数:14  
标签:控制器 MediatR InfoDemo 通知 消息传递 NET logger

前言

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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

 

标签:控制器,MediatR,InfoDemo,通知,消息传递,NET,logger
From: https://www.cnblogs.com/1312mn/p/18357288

相关文章

  • Minio .NET 新版API使用
     Minio新版API有很多改动网上搜索不到做个记录。 创建Client创建client的方式和以前差别不大varminioClient=newMinioClient().WithEndpoint(AppSettings._minio?.EndPoint,(int)(AppSettings._minio?.Port)).WithCredentials(AppSettings._minio?.AccessKey......
  • StarNet:关于 Element-wise Multiplication 的高性能解释研究 | CVPR 2024
    论文揭示了staroperation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力。基于此提出了StarNet,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟来源:晓飞的算法工程笔记公众号论文:RewritetheStars论文地址:https://arxiv.org/abs/240......
  • Mqttnet实现的mqtt客户端
    usingSystem.Collections.Concurrent;usingSystem.Text;usingMQTTnet;usingMQTTnet.Client;usingMicrosoft.Extensions.Options;usingMicrosoft.Extensions.Logging;usingMQTTnet.Server;usingMicrosoft.Extensions.Hosting;usingSystem.Net.NetworkInformat......
  • 【Java手写RPC框架系列-1】—— 基础知识准备:RPC+Netty
    代码随想录知识星球介绍https://articles.zsxq.com/id_m76jd72243bi.html基于Netty手写实现RPChttps://www.cnblogs.com/mic112/p/15565795.html项目背景与介绍RPC:远程过程调用协议:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序......
  • 关于Pytorch中net.eval()和torch.no_grad()的意义理解
    Q:defevaluate_accuracy(net,data_iter):#@save"""计算在指定数据集上模型的精度"""ifisinstance(net,torch.nn.Module):net.eval()#将模型设置为评估模式metric=Accumulator(2)#正确预测数、预测总数withtorch.no_grad():......
  • kubernetes基于csi使用rbd存储
    描述ceph-csi扩展各种存储类型的卷的管理能力,实现第三方存储ceph的各种操作能力与k8s存储系统的结合。通过ceph-csi使用cephrbd块设备,它动态地提供rbd以支持Kubernetes持久化存储,并将这些rbd映射给pod做为块设备持久化数据使用。Ceph将pod存在块设备的数据以副本......
  • Avnet ZUBoard 1CG开发板上手—深度学习新选择
    AvnetZUBoard1CG开发板上手—深度学习新选择摘要本文主要介绍了AvnetZUBoard1CG开发板的特性、架构、硬件单元等概念,并对如何使用以太网接口和串口连接开发板进行基本介绍,同时辅以两个应用例程演示其功能。原文链接:FreakStudio的博客往期推荐:学嵌入式的你,还不会面向......
  • 微软NET FrameWork离线运行库+离线安装包合集,一键安装版 微软.NET离线运行库合集2024
     微软.NET离线运行库合集2024最新版是一款专为便捷、高效地管理.NET运行库而设计的工具。这款软件集成了各种版本的.NET运行库,并提供了离线安装的功能,使用户能够在没有网络连接的情况下轻松地安装所需的运行库。该软件的出现极大地简化了.NET开发环境的配置和维护过程。用户可......
  • .NET周刊【8月第1期 2024-08-04】
    国内文章EFCore性能优化技巧https://www.cnblogs.com/baibaomen-org/p/18338447这篇文章介绍了在代码层面上优化EFCore实例池和拆分查询的方法。首先,文章建议使用DbContext实例池来重复利用实例,避免资源浪费,并提供相关使用示例。其次,文章讨论了笛尔卡乘积对复杂查询性能的影......
  • 利用Jenkins Pipeline高效部署Kubernetes服务
    什么是JenkinsPipelineJenkinsPipeline是一种持续集成和持续交付(CI/CD)的功能,它允许开发者将复杂的构建、测试和部署流程编码为一系列称为“管道”的自动化步骤。这些步骤以Groovy脚本的形式编写,并且可以在Jenkins中可视化管理。Pipeline提供了代码化和可重用的构建过程,支持更......