前言

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



最新文章

  1. 清空表数据 mysql让主键从1开始
  2. Mysql备份系列(3)--innobackupex备份mysql大数据(全量+增量)操作记录
  3. c++之map
  4. SSH 登录VPS解决 The directory media/wysiwyg is not writable by server.问题
  5. 微软.NET Framework 4.5.2 RTM正式版
  6. Spark的优点
  7. git的学习网站
  8. POJ 3922A Simple Stone Game
  9. 【转】hibernate.hbm.xml详解
  10. Android权限Uri.parse
  11. PSAM 卡的应用操作方法
  12. regular expression 基本语法
  13. 高性能IO模型浅析(彩图解释)good
  14. ZOj 3466 The Hive II
  15. Java String常用方法
  16. 201621123031 《Java程序设计》第10周学习总结
  17. python田忌赛马
  18. Python3 获取本机 IP
  19. caffe中的若干问题
  20. nginx File not found 错误(转)

热门文章

  1. .NET使用AutoResetEvent实现多线程打印奇偶数
  2. 课时四:Action操作
  3. ChromiumWebBrowser flash不能自动播放问题解决方案
  4. sql server full join拼接表数据,按组加序号
  5. 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反
  6. 第十章、Qt Designer中的Spacers部件
  7. 攻防世界 web进阶区 ics-06
  8. linux进程管理(linux命令安装、进程生命周期、进程状态)
  9. tensorflow 小记——如何对张量做任意行求和,得到新tensor(一种方法:列表生成式)
  10. IntelliJ IDEA2019.3.2破解/永久激活/安装教程