共计 2621 个字符,预计需要花费 7 分钟才能阅读完成。
ASP.NET Core MVC 入门到精通 – 3. 应用 MediatR
环境:
- .NET 5
- ASP.NET Core MVC (project)
1. MediatR
MediatR .NET 中的简略中介者模式实现,一种 过程内消息传递机制
(无其余内部依赖)。反对以同步或异步的模式进行申请 / 响应,命令,查问,告诉和事件的消息传递,并通过 C# 泛型反对音讯的智能调度。
Simple mediator implementation in .NET
In-process messaging with no dependencies.
Supports request/response, commands, queries, notifications and events, synchronous and async with intelligent dispatching via C# generic variance.另:中介者模式 – 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合涣散,且能够独立地扭转它们之间的交互。中介者模式又叫调解模式,它是迪米特法令的典型利用。
2. 装置 & 配置
对于.NET5 (.net core), 应用 nuget 装置MediatR.Extensions.Microsoft.DependencyInjection
.
配置:
public void ConfigureServices(IServiceCollection services)
{services.AddControllersWithViews();
services.AddMediatR(typeof(Startup));
}
3. MediatR 音讯类型
3.1. Notifications 告诉模式
Notifications 告诉模式用于生产者发送告诉,消费者(能够多个)接管到告诉后,进行后续解决。
例:一个 APS.NET 页面,拜访时,发送 Notifications 告诉;消费者简略记录收到告诉的工夫。
3.1.1. 定义基于 INotification 的告诉类
public class Ping : INotification {}
3.1.2. 定义消费者(关注告诉的解决办法)
public class Pong1 : INotificationHandler<Ping>
{public Task Handle(Ping notification, CancellationToken cancellationToken)
{Debug.WriteLine($"Pong1, {DateTime.Now}");
return Task.CompletedTask;
}
}
public class Pong2 : INotificationHandler<Ping>
{public Task Handle(Ping notification, CancellationToken cancellationToken)
{Debug.WriteLine($"Pong2, {DateTime.Now}");
return Task.CompletedTask;
}
}
3.1.3. 发送音讯告诉
// 基于 dotnet core 的依赖注入,注入 IMediator 对象
private readonly IMediator _mediator;
public HomeController(ILogger<HomeController> logger, IMediator mediator)
{
_logger = logger;
_mediator = mediator;
}
public async Task<IActionResult> IndexAsync()
{
// e.g. 拜访首页时,发送告诉
await _mediator.Publish(new Ping());
return View();}
3.1.4. 输入
Pong1, 5/27/2021 4:37:18 PM
Pong2, 5/27/2021 4:37:18 PM
3.2. Request/Response 申请响应模式
request/response 用于命令和查问的场景。
3.2.1. 创立申请类:
public class RequestModel: IRequest<string>
{}
3.2.2. 创立申请解决类
不同于告诉模式,request/response 只能有一个申请解决。
public class RequestHandeler : IRequestHandler<RequestModel, string>
{public Task<string> Handle(RequestModel request, CancellationToken cancellationToken)
{return Task.FromResult($"Pong {DateTime.Now}"); // 测试,返回内容给 request
}
}
3.2.3. 页面中发送申请
private readonly ILogger<HomeController> _logger;
private readonly IMediator _mediator;
public HomeController(ILogger<HomeController> logger, IMediator mediator)
{
_logger = logger;
_mediator = mediator;
}
public async Task<IActionResult> IndexAsync()
{
// send request, and show Response
var response = await _mediator.Send(new RequestModel());
Debug.WriteLine("Got response in controller:" +response);
return View();}
3.2.4. 输入
Got response in controller: Pong 5/28/2021 2:04:26 PM
4. 总结
- MediatR 是一种
过程内消息传递机制
。 - 反对以同步或异步的模式进行申请 / 响应,命令,查问(CQRS),告诉和事件的消息传递,并通过 C# 泛型反对音讯的智能调度。
- 其外围是音讯的解耦。
- 利用场景: 实现 CQRS、EventBus 等。
5. 参考 & 代码
- 参考: https://github.com/jbogard/MediatR
- 代码: https://github.com/jackniu81/dotnet/tree/main/MediatR-Demo
正文完