首页
视频
资源
登录
原
.netcore 3.1 MediatR:轻松实现命令查询职责分离模式(CQRS)
5091
人阅读
2020/10/26 17:50
总访问:
2535469
评论:
0
收藏:
0
手机
分类:
.net后台框架
![.netcore](https://img.tnblog.net/arcimg/hb/c857299a86d84ee7b26d181a31e58234.jpg ".netcore") >#.netcore 3.1 MediatR:轻松实现命令查询职责分离模式(CQRS) [TOC] <br/> >###中介者模式 tn>用一个**中介对象**封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。 使用**中介模式**,对象之间的交互将封装在中介对象中。对象不再直接相互交互(解耦),而是通过中介进行交互。这减少了对象之间的依赖性,从而减少了耦合。 中介者的**优点**与**缺点** >优点:中介者模式的优点就是减少类间的依赖,把原有的一对多的依赖变成了一对一的依赖,同事类只依赖中介者,减少了依赖,当然同时也降低了类间的耦合 缺点:中介者模式的缺点就是中介者会膨胀得很大,而且逻辑复杂,原本N个对象直接的相互依赖关系转换为中介者和同事类的依赖关系,同事类越多,中介者的逻辑就越复杂。 <br/> >###单播消息传输(Demo) tn>单播消息传输,也就是一对一的消息传递,一个消息对应一个消息处理。其通过 **IRequest** 来抽象单播消息,用 **IRequestHandler** 进行消息处理。 >创建项目 ![](https://img.tnblog.net/arcimg/hb/647a1d76a0be47d08a7fdc1487531026.png) >添加下列nuget包到项目中 ```xml <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> ``` ![](https://img.tnblog.net/arcimg/hb/98d57706ad204c16be93210477733113.png) >添加 <font style="color:#2ecc71;font-weight:bold;">MyCommand.cs</font> ```csharp /// <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); } } ``` ><font style="color:#2ecc71;font-weight:bold;">Program.cs</font> ```csharp 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!"); } ``` >运行结果 ![](https://img.tnblog.net/arcimg/hb/dfa67c3952544871a90e72781af977f5.png) <br/> >###多播消息传输(Demo) tn>多播消息传输,也就是一对多的消息传递,一个消息对应多个消息处理。其通过**INotification**来抽象多播消息,对应的消息处理类型为**INotificationHandler**。 >添加 <font style="color:#2ecc71;font-weight:bold;">Ping.cs</font> ```csharp 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; } } ``` ><font style="color:#2ecc71;font-weight:bold;">Program.cs</font> ```csharp await mediator.Publish(new Ping() { Name="Start" }); ``` >运行结果 ![](https://img.tnblog.net/arcimg/hb/30932ab5426a490d9a682d2b88e4a951.png)
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}
尘叶心繁
这一世以无限游戏为使命!
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net后台框架
166篇
linux
17篇
linux中cve
1篇
windows中cve
0篇
资源分享
10篇
Win32
3篇
前端
28篇
传说中的c
4篇
Xamarin
9篇
docker
15篇
容器编排
101篇
grpc
4篇
Go
15篇
yaml模板
1篇
理论
2篇
更多
Sqlserver
4篇
云产品
39篇
git
3篇
Unity
1篇
考证
2篇
RabbitMq
23篇
Harbor
1篇
Ansible
8篇
Jenkins
17篇
Vue
1篇
Ids4
18篇
istio
1篇
架构
2篇
网络
7篇
windbg
4篇
AI
18篇
threejs
2篇
人物
1篇
嵌入式
2篇
python
13篇
HuggingFace
8篇
pytorch
9篇
opencv
6篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术