CQRS(Command Query Responsibility Segregation)命令查询职责分离模式,它主要从咱们业务系统中进行分离出咱们(Command 增、删、改)和(Query 查),
同时他能够明确的区分咱们每个动做向咱们的请求模型和响应模型.从而下降了咱们系统的复杂性.git
CQRS模式经过使用不一样的接口来分离读取数据和更新数据的操做。CQRS模式能够最大化性能,扩展性以及安全性, 还会为系统的持续演化提供更多的弹性,防止Update命令在域模型Level发生冲突。
一般状况咱们使用同一数据模型进行咱们数据的查询和修改,这是一个很是简单的CURD,在一些复杂的应用程序中,这种方法会变的难以操做,例如在读取方面应用程序可能会存在大量的查询,
返回具备不一样的数据传输对象(DTO),对象映射可能会变的很是复杂,在写入方面,模型可能实施复杂的验证和业务逻辑.结果致使模型太多操做,总体变的至关得复杂.github
以下图所示:api
MediatR他为咱们解决将消息发送与消息处理进行了解耦,他同时支持异步和同步来发送和监听消息.安全
Install MediatR异步
PM> Install-Package MediatR
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接口来实现,该接口有两个参数,第一个是请求内容,第二个是响应内容.async
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.DependencyInjectioncode
PM> MediatR.Extensions.Microsoft.DependencyInjection
在Startup.cs中注册MediatR对象
services.AddMediatR(Assembly.GetExecutingAssembly());
咱们只须要注入IMediator接口,经过以下代码咱们来使用他们blog
[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 主要包含两大概念,一个是读写分离,一个是事件源。事件源不是必须项
https://github.com/hueifeng/BlogSample/tree/master/src/CQRSMediatR