
.netcore 3.1 MediatR:轻松实现命令查询职责分离模式(CQRS)
中介者模式
用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
使用中介模式,对象之间的交互将封装在中介对象中。对象不再直接相互交互(解耦),而是通过中介进行交互。这减少了对象之间的依赖性,从而减少了耦合。
中介者的优点与缺点
优点:中介者模式的优点就是减少类间的依赖,把原有的一对多的依赖变成了一对一的依赖,同事类只依赖中介者,减少了依赖,当然同时也降低了类间的耦合
缺点:中介者模式的缺点就是中介者会膨胀得很大,而且逻辑复杂,原本N个对象直接的相互依赖关系转换为中介者和同事类的依赖关系,同事类越多,中介者的逻辑就越复杂。
单播消息传输(Demo)
单播消息传输,也就是一对一的消息传递,一个消息对应一个消息处理。其通过 IRequest 来抽象单播消息,用 IRequestHandler 进行消息处理。
创建项目
添加下列nuget包到项目中
<ItemGroup>
<PackageReference Include="MediatR" Version="9.0.0" />
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.9" />
</ItemGroup>
添加 MyCommand.cs
/// <summary>
/// 创建 消息请求
/// </summary>
internal class MyCommand : IRequest<long>
{
public string CommandName { get; set; }
}
/// <summary>
/// 创建 消息处理
/// </summary>
internal class MyCommandHandler : IRequestHandler<MyCommand, long>
{
public Task<long> Handle(MyCommand request, CancellationToken cancellationToken)
{
System.Console.WriteLine($"MyCommandHandler run command:{request.CommandName}");
return Task.FromResult(10L);
}
}
Program.cs
async static Task Main(string[] args)
{
var services = new ServiceCollection();
services.AddMediatR(typeof(Program).Assembly);
var serviceProvider = services.BuildServiceProvider();
var mediator = serviceProvider.GetService<IMediator>();
await mediator.Send(new MyCommand { CommandName = "cmd01" });
Console.WriteLine("Hello World!");
}
运行结果
多播消息传输(Demo)
多播消息传输,也就是一对多的消息传递,一个消息对应多个消息处理。其通过INotification来抽象多播消息,对应的消息处理类型为INotificationHandler。
添加 Ping.cs
public class Ping : INotification {
public string Name { get; set; }
}
//构建 消息处理器1
public class Pong1 : INotificationHandler<Ping>
{
public Task Handle(Ping notification, CancellationToken cancellationToken)
{
Console.WriteLine($"{notification.Name} Pong 1");
return Task.CompletedTask;
}
}
//构建 消息处理器2
public class Pong2 : INotificationHandler<Ping>
{
public Task Handle(Ping notification, CancellationToken cancellationToken)
{
Console.WriteLine($"{notification.Name} Pong 2");
return Task.CompletedTask;
}
}
Program.cs
await mediator.Publish(new Ping() { Name="Start" });
运行结果
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术