前言

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

.NET 8 中利用 MediatR 实现高效消息传递的更多相关文章

  1. 神经网络训练中的Tricks之高效BP(反向传播算法)

    神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) zouxy09@qq.com http://blog.csdn.net/zouxy09 ...

  2. Objective-c中的对象间的消息传递以及消息路由

    刚开始使用Objective-C时,总是习惯将对象间发送消息之间称呼为方法调用.心想,这和c#不是一回事吗?不就是调用实例方法吗,还搞个消息发送作甚,最后还不是要转化为方法的调用?通过一段时间的理解学 ...

  3. [译]ASP.NET Core中使用MediatR实现命令和中介者模式

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9866068.html 在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何 ...

  4. NET Core中使用MediatR实现命令和中介者模式

    NET Core中使用MediatR实现命令和中介者模式 https://www.cnblogs.com/yilezhu/p/9866068.html 在本文中,我将解释命令模式,以及如何利用基于命令 ...

  5. (数据科学学习手札127)在Python中使用icecream实现高效debug

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 尽管有那么多花里胡哨的debug工具和方式 ...

  6. (数据科学学习手札145)在Python中利用yarl轻松操作url

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,在诸如网络爬虫.web应用开发 ...

  7. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  8. [原创]MYSQL中利用外键实现级联删除和更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...

  9. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  10. PHP中利用GD实现的柱状图

    PHP中利用GD实现的柱状图,自己写的一个画柱状图的类,上代码. <?php Class Chart{ private $image; // 定义图像 private $title; // 定义 ...

随机推荐

  1. 14-vertical-aligin

    01 行盒的理解 作用: 将当前行里的所有内容包裹起来 <!DOCTYPE html> <html lang="en"> <head> < ...

  2. QT学习:03 信号与槽

    --- title: framework-cpp-qt-03-信号与槽 EntryName: framework-cpp-qt-03-signal-slot date: 2020-04-09 13:5 ...

  3. Linux基本编程环境安装

    前言 可以采用组合式安装,如:https://oneinstack.com/ 选择好要安装的,然后复制安装命令就可以一键搞定很多东西了 VMware安装Centos7 按照物理机CPU实际情况,选择处 ...

  4. windows下rust环境的安装(现在是2023年5月份)

    在自己家电脑上安装一下rust,还是遇到一些问题,这里记录一下,免得后面再踩坑. 官方网站 获取主要信息还得靠官网,比如安装软件:) 地址是 https://www.rust-lang.org/zh- ...

  5. 一个难忘的json反序列化问题

    前言 最近我在做知识星球中的商品秒杀系统,昨天遇到了一个诡异的json反序列化问题,感觉挺有意思的,现在拿出来跟大家一起分享一下,希望对你会有所帮助. 案发现场 我最近在做知识星球中的商品秒杀系统,写 ...

  6. 如何计算QPS、PV和需要部署机器数量?

    基本概念 网站访问量的常用衡量标准:独立访客(UV) 和 综合浏览量(PV),一般以日为单位来计算. 独立访客(UV):指一定时间范围内相同访客多次访问网站,只计算为1个独立访客. 综合浏览量(PV) ...

  7. Konva 内容重叠无法触发点击事件的解决方法

    写在前面: 环境:Vue3 + Konva + vite 在绘制界面时踩坑,主要是关于 listening 属性的使用 在绘制界面时,不免出现有内容重叠的情况,这会影响事件的触发 使用设置listen ...

  8. SpringBoot自定义全局异常返回页面

    返回自定义异常界面,需要引入thymeleaf依赖(非必须,如果是简单的html界面则不用) <dependency> <groupId>org.springframework ...

  9. 洛谷P1020

    又是一道做的很麻的题,准确来说感觉这不是一道很好的dfs题,没有体现dfs的一些特点 反而感觉是在考察dp,刚开始也是按照我的思路交了3次都没过 原本以为所选的数应该都是由上一次的最大值推出来的,后面 ...

  10. AT_arc041_b 题解

    洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定一个 \(N \times M\) 的矩阵,此矩阵的每一个元素都向上.下.左.右 ...