zoukankan      html  css  js  c++  java
  • .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



     

  • 相关阅读:
    三十四:布局之混合布局、圣杯布局、双飞翼布局
    三十三:布局之经典的列布局
    三十二:布局之经典的行布局
    三十一:CSS之CSS定位之position
    三十:CSS之用浮动实现网页的导航和布局
    二十九:CSS之浮动float
    二十八:CSS之列表list-type
    二十七:CSS之背景background
    二十六:CSS之盒子模型之小案例
    二十五:CSS之盒子模型之display属性
  • 原文地址:https://www.cnblogs.com/netlock/p/13408351.html
Copyright © 2011-2022 走看看