前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET Core 使用MediatR CQRS模式

.NET Core 使用MediatR CQRS模式

原创
作者头像
HueiFeng
修改2020-04-13 11:23:48
5380
修改2020-04-13 11:23:48
举报
文章被收录于专栏:HueiFeng技术专栏

前言

CQRS(Command Query Responsibility Segregation)命令查询职责分离模式,它主要从我们业务系统中进行分离出我们(Command 增、删、改)和(Query 查),

同时他可以明确的区分我们每一个动作向我们的请求模型和响应模型.从而降低了我们系统的复杂性.

CQRS模式通过使用不同的接口来分离读取数据和更新数据的操作。CQRS模式可以最大化性能,扩展性以及安全性, 还会为系统的持续演化提供更多的弹性,防止Update命令在域模型Level发生冲突。

通常情况我们使用同一数据模型进行我们数据的查询和修改,这是一个非常简单的CURD,在一些复杂的应用程序中,这种方法会变的难以操作,例如在读取方面应用程序可能会存在大量的查询,

返回具有不同的数据传输对象(DTO),对象映射可能会变的非常复杂,在写入方面,模型可能实施复杂的验证和业务逻辑.结果导致模型太多操作,整体变的相当得复杂.

如下图所示:

MediatR他为我们解决将消息发送与消息处理进行了解耦,他同时支持异步和同步来发送和监听消息.

MediatR

Install MediatR

代码语言:txt
复制
PM> Install-Package MediatR
  • IMeditator
  • IResponse、IRequest
  • IRequestHandler<in TRequest, TResponse>
代码语言:txt
复制
    public class CreateOrderRequestModel: 
        IRequest<string>
    {
        public string UserId { get; set; }
        public string CardNumber { get; set; }
    }
代码语言:txt
复制
    public class GetOrderByIdRequestModel:IRequest<string>
    {
        public string OrderId { get; set; }
    }
代码语言:txt
复制
 //返回值
 public interface IRequest<out TResponse> : IBaseRequest{}
 //无返回值
 public interface IRequest : IRequest<Unit>, IBaseRequest{}

创建处理程序,所有的处理程序都通过IRequestHandler接口来实现,该接口有两个参数,第一个是请求内容,第二个是响应内容.

代码语言:txt
复制
    public class CreateOrderCommandHandler
        : IRequestHandler<CreateOrderRequestModel, string>
    {
        public Task<string> Handle(CreateOrderRequestModel request, CancellationToken cancellationToken)
        {
            //do something...
            return Task.FromResult(request.UserId);
        }
    }

正如下代码片段,处理程序实现了IRequestHandler带有输入和输出类型定义的接口

代码语言:txt
复制
public interface IRequestHandler<in TRequest, TResponse> where TRequest : IRequest<TResponse>
  {
    Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken);
  }
代码语言:txt
复制
    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

代码语言:txt
复制
PM> MediatR.Extensions.Microsoft.DependencyInjection

在Startup.cs中注册MediatR

代码语言:txt
复制
services.AddMediatR(Assembly.GetExecutingAssembly());

我们只需要注入IMediator接口,通过如下代码我们来使用他们

代码语言:txt
复制
    [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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • MediatR
  • Reference
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档