前言

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
接口的实现。

usingMediatR;namespaceManageCore.MediatrDemo
{
public record InfoDemo(stringMsg) : 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<InfoDemo>
接口的实现。

它接受一个
ILogger<InfoDemoHandler>
类型的构造函数参数
_logger
,并实现了
INotificationHandler<InfoDemo>
接口。
INotificationHandler<T>
接口是
MediatR
提供的接口,用于处理
T
类型的通知。

usingMediatR;namespaceManageCore.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> publicTask Handle(InfoDemo notification, CancellationToken cancellationToken)
{
_logger.LogInformation($
"InfoDemoHandler Received: {notification}. {DateTimeOffset.Now}");returnTask.CompletedTask;
}
}
}

这段代码实现了
INotificationHandler<InfoDemo>
接口,并在
Handle
方法中处理
InfoDemo
类型的通知。


MediatR
接收到
InfoDemo
类型的通知时,它会调用
InfoDemoHandler

Handle
方法来处理该通知。

4、创建控制器类

定义一个名为
MediatorDemoController
的 ASP.NET Core 控制器,使用
MediatR
发布通知。

usingMediatR;usingMicrosoft.AspNetCore.Mvc;namespaceManageCore.MediatrDemo.Controllers
{
[ApiController]
[Route(
"[controller]")]public classMediatorDemoController : ControllerBase
{
private readonlyIMediator 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 stringMediatorDemoMethod()
{
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<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技术匠]
社区,与其他热爱技术的同行一起交流心得,共同成长!

标签: none

添加新评论