.NET Core 使用MediatR CQRS模式
前言
CQRS(Command Query Responsibility Segregation)命令查询职责分离模式,它主要从我们业务系统中进行分离出我们(Command 增、删、改)和(Query 查),
同时他可以明确的区分我们每一个动作向我们的请求模型和响应模型.从而降低了我们系统的复杂性.
CQRS模式通过使用不同的接口来分离读取数据和更新数据的操作。CQRS模式可以最大化性能,扩展性以及安全性, 还会为系统的持续演化提供更多的弹性,防止Update命令在域模型Level发生冲突。
通常情况我们使用同一数据模型进行我们数据的查询和修改,这是一个非常简单的CURD,在一些复杂的应用程序中,这种方法会变的难以操作,例如在读取方面应用程序可能会存在大量的查询,
返回具有不同的数据传输对象(DTO),对象映射可能会变的非常复杂,在写入方面,模型可能实施复杂的验证和业务逻辑.结果导致模型太多操作,整体变的相当得复杂.
如下图所示:

MediatR他为我们解决将消息发送与消息处理进行了解耦,他同时支持异步和同步来发送和监听消息.
MediatR
Install MediatR
PM> Install-Package MediatR
- IMeditator
- IRequese、IRequest
- IRequestHandler<in TRequest, TResponse>
public class CreateOrderRequestModel:
IRequest<string>
{
public string UserId { get; set; }
public string CardNumber { get; set; }
}
public class GetOrderByIdRequestModel:IRequest<string>
{
public string OrderId { get; set; }
}
//返回值
public interface IRequest<out TResponse> : IBaseRequest{}
//无返回值
public interface IRequest : IRequest<Unit>, IBaseRequest{}
创建处理程序,所有的处理程序都通过IRequestHandler接口来实现,该接口有两个参数,第一个是请求内容,第二个是响应内容.
public class CreateOrderCommandHandler
: IRequestHandler<CreateOrderRequestModel, string>
{
public Task<string> Handle(CreateOrderRequestModel request, CancellationToken cancellationToken)
{
//do something...
return Task.FromResult(request.UserId);
}
}
正如下代码片段,处理程序实现了IRequestHandler带有输入和输出类型定义的接口
public interface IRequestHandler<in TRequest, TResponse> where TRequest : IRequest<TResponse>
{
Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken);
}
public class GetOrderByIdQueryHandler :
IRequestHandler<GetOrderByIdRequestModel, string>
{
public Task<string> Handle(GetOrderByIdRequestModel request, CancellationToken cancellationToken)
{
//do something
return Task.FromResult(request.OrderId);
}
}
Install MediatR.Extensions.Microsoft.DependencyInjection
PM> MediatR.Extensions.Microsoft.DependencyInjection
在Startup.cs中注册MediatR
services.AddMediatR(Assembly.GetExecutingAssembly());
我们只需要注入IMediator接口,通过如下代码我们来使用他们
[Route("api/[controller]")]
[ApiController]
public class OrderController : ControllerBase
{
private readonly IMediator _mediator;
public OrderController(IMediator mediator)
{
_mediator = mediator;
}
[HttpPost]
public async Task<IActionResult> Post([FromBody]CreateOrderRequestModel requestModel)
{
var response =await _mediator.Send(requestModel);
return Ok(response);
}
[HttpGet]
public async Task<IActionResult> Get([FromQuery]GetOrderByIdRequestModel requestModel)
{
var response = await _mediator.Send(requestModel);
return Ok(response);
}
}
CQRS 主要包含两大概念,一个是读写分离,一个是事件源。事件源不是必须项
Reference
https://github.com/hueifeng/BlogSample/tree/master/src/CQRSMediatR
.NET Core 使用MediatR CQRS模式的更多相关文章
- .NET Core 使用MediatR CQRS模式 读写分离
前言 CQRS(Command Query Responsibility Segregation)命令查询职责分离模式,它主要从我们业务系统中进行分离出我们(Command 增.删.改)和(Query ...
- .NET 5 源代码生成器——MediatR——CQRS
在这篇文章中,我们将探索如何使用.NET 5中的新source generator特性,使用MediatR库和CQRS模式自动为系统生成API. 中介者模式 中介模式是在应用程序中解耦模块的一种方式. ...
- DDD/CQRS模式,微服务,容器
DDD/CQRS模式,微服务,容器 https://docs.microsoft.com/zh-cn/previous-versions/msp-n-p/ee658109(v=pandp.10) We ...
- Asp.Net Core 使用 MediatR
Asp.Net Core 使用 MediatR 项目中使用了CQRS读写分离,增删改 的地方使用了 MediatR ,将进程内消息的发送和处理进行解耦.于是便有了这篇文章,整理并记录一下自己的学习.遇 ...
- 浅谈命令查询职责分离(CQRS)模式
在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体.在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得复杂,用户增多,这种设计就会出现一些性能 ...
- [.NET领域驱动设计实战系列]专题十:DDD扩展内容:全面剖析CQRS模式实现
一.引言 前面介绍的所有专题都是基于经典的领域驱动实现的,然而,领域驱动除了经典的实现外,还可以基于CQRS模式来进行实现.本专题将全面剖析如何基于CQRS模式(Command Query Respo ...
- 转:浅谈命令查询职责分离(CQRS)模式
原文来自于:http://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html 在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查 ...
- CQRS模式实现
[.NET领域驱动设计实战系列]专题十:DDD扩展内容:全面剖析CQRS模式实现 一.引言 前面介绍的所有专题都是基于经典的领域驱动实现的,然而,领域驱动除了经典的实现外,还可以基于CQRS模式来进行 ...
- 查询职责分离(CQRS)模式
查询职责分离(CQRS)模式 在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体.在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得复杂,用户 ...
随机推荐
- 分享个Class工具类
import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLCo ...
- Python学习前端之JavaScript
JavaScript介绍 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客户端执行的语言). Nets ...
- 5.Metasploit攻击载荷深入理解
Metasploit 进阶第三讲 深入理解攻击载荷 01 Nesus介绍.安装及使用 Nessus介绍 Nessus是一款著名的漏洞扫描及分析工具,提供完整的漏洞扫描服务,并随时更新漏洞数据库. ...
- K - 回转寿司(值域段数(板题) + 动态开点)
回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不一样的,我们定义小Z对每盘寿司都有一个 ...
- 个推IGt.BaseTemplate.php,不仅有bug,还有bom头,好恶心!
错误截图,提交吧,还有一个不明飞行物. 去掉utf-8 BOM:set nobomb保留utf-8 BOM:set bomb
- php数据库应用程序建议
一.保持独立的读写连接 开始就创建两个数据库连接是一个好的方法,一个用于读取,一个用于写入,并且允许不同的数据库服务器连接他们.如果只有一个服务器,则将它们设置彼此相同. 当操作为INSERT, UP ...
- android的volley学习
更简单的一种方式是在build.gradle中引入依赖[推荐这种方式] compile 'com.android.volley:volley:1.1.1' StringRequest的用法接下来我们看 ...
- hicharts中treemap添加超链接
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Android 6.0及以上版本如何实现从图库中选取图片和拍照功能
XML 代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...
- PHP获取当天、本周、本月、本季度、本年度时间
function get_date($date, $t = 'd', $n = 0) { if ($t == 'd') { $firstday = date('Y-m-d 00:00:00', str ...