返回顶部
首页 > 资讯 > 精选 >如何使用MediatR实现POST请求
  • 950
分享到

如何使用MediatR实现POST请求

2023-06-22 06:06:10 950人浏览 安东尼
摘要

本篇内容介绍了“如何使用MediatR实现POST请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!需求需求很简单:如何创建新的TodoLi

本篇内容介绍了“如何使用MediatR实现POST请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    需求

    需求很简单:如何创建新的TodoList和TodoItem并持久化。

    初学者按照教程去实现的话,应该分成以下几步:创建Controller并实现POST方法;实用传入的请求参数new一个数据库实体对象;调用IRepository<T>完成数据库的写入,最多会在中间加一层Service。这个做法本身没有问题,也是需要从初学阶段开始扎实地掌握开发技能的必经之路,有助于帮助理解逻辑调用的过程。

    对于稍微正式一些的项目.net工程上习惯的实现是通过使用一些比较成熟的类库框架,有效地对业务逻辑进行分类管理、消除冗余代码,以达到业务逻辑职责清晰简洁的目的。在这个阶段我们经常使用的两个类库分别是AutoMapper和MediatR。

    目标

    合理组织并使用MediatR,完成POST请求。

    原理与思路

    首先来简单地介绍一下这个类库。

    关于CQRS模式、中介者模式和MediatR

    CQRS模式

    CQRS模式全称是“Command Query Responsibility Segregation”,正如字面意思,CQRS模式的目的在于将读取操作和写入操作的指责区分开,并使用不同的Model去表示。从CRUD的角度来说,就是把R和CUD区分开来对待。如下图所示:

    如何使用MediatR实现POST请求

    这个模式可以有效地应用到具有主从分离的数据库架构中,当需要获取数据时,从只读数据库(一般是从库)中读取数据,当需要写入或更新数据时,向主库进行操作。

    CQRS模式旨在解决的问题是:为了屏蔽数据库层面“写优先”还是“读优先”的优化设计策略,在业务逻辑侧进行解耦。

    任何设计模式都是对解决特定问题的一个Trade off,自然也带来了一些缺点,首先就是服务内部的组件复杂度上升了,因为需要创建额外的类来实现CQRS模式;其次如果数据层是分离的,那么可能会有数据的状态不一致问题。

    中介者Mediator模式

    这是23种基本设计模式中的一个,属于行为型设计模式,它给出了组件之间交互的一种解耦的方式。简单参考下图,具体内容就不过多解释了,任何一篇介绍设计模式的文章都有介绍。

    如何使用MediatR实现POST请求

    这种设计模式实际上是一种采用依赖倒置(Inversion of Control, ioc)的方式,实现了图中蓝色组件的松耦合。

    MediatR

    这是在开发中被广泛采用的实现以上两种设计模式的类库,更准确的说法是,它通过应用中介者模式,实现了进程内CQRS。基本思想是所有来自api接口和数据存储之间的逻辑,都需要通过MediatR来组织(即所谓的“中介者”)。

    从实现上看,MediatR提供了几组用于不同场景的接口,我们在本文中处理的比较多的是IRequest<T>/IRequestHandler<T>以及INotification<T>/INotificationHander<T>两组接口,更多的请参考官方文档和例子。

    实现

    所有需要使用MediatR的地方都集中在Application项目中。

    引入MediatR

    dotnet add src/TodoList.Application/TodoList.Application.csproj package MediatR.Extensions.Microsoft.DependencyInjection

    为了适配CQRS的模式,我们在Application项目中的TodoLists和TodoItems下相同地创建几个文件夹:

    Commands:用于组织CUD相关的业务逻辑;

    Queries:用于组织R相关的业务逻辑;

    EventHandlers:用于组织领域事件处理的相关业务逻辑。

    在Application根目录下同样创建DependencyInjection.cs用于该项目的依赖注入:

    DependencyInjection.cs

    using System.Reflection;using Microsoft.Extensions.DependencyInjection;namespace TodoList.Application;public static class DependencyInjection{    public static IServiceCollection AddApplication(this IServiceCollection services)    {        services.AddMediatR(Assembly.GetExecutingAssembly());        return services;    }}

    并在Api项目中使用:

    // 省略其他...// 添加应用层配置builder.Services.AddApplication();// 添加基础设施配置builder.Services.AddInfrastructure(builder.Configuration);

    实现Post请求

    在本章中我们只实现TodoList和TodoItem的Create接口(POST),剩下的接口后面的文章中逐步涉及。

    POST TodoList

    在Application/TodoLists/Commands/下新建一个目录CreateTodoList用于存放创建一个TodoList相关的所有逻辑:

    CreateTodoListCommand.cs

    using MediatR;using TodoList.Application.Common.Interfaces;namespace TodoList.Application.TodoLists.Commands.CreateTodoList;public class CreateTodoListCommand : IRequest<Guid>{    public string? Title { get; set; }}public class CreateTodoListCommandHandler : IRequestHandler<CreateTodoListCommand, Guid>{    private readonly IRepository<Domain.Entities.TodoList> _repository;    public CreateTodoListCommandHandler(IRepository<Domain.Entities.TodoList> repository)    {        _repository = repository;    }    public async Task<Guid> Handle(CreateTodoListCommand request, CancellationToken cancellationToken)    {        var entity = new Domain.Entities.TodoList        {            Title = request.Title        };        await _repository.AddAsync(entity, cancellationToken);        return entity.Id;    }}

    有一些实践是将Request和RequestHandler分开两个文件,我更倾向于像这样将他俩放在一起,一是保持简洁,二是当你需要顺着一个Command去寻找它对应的Handler时,不需要更多的跳转。

    接下来在TodoListController里实现对应的POST方法,

    using MediatR;using Microsoft.Aspnetcore.mvc;using TodoList.Application.TodoLists.Commands.CreateTodoList;namespace TodoList.Api.Controllers;[ApiController][Route("/todo-list")]public class TodoListController : ControllerBase{    private readonly IMediator _mediator;    // 注入MediatR    public TodoListController(IMediator mediator)        => _mediator = mediator;    [HttpPost]    public async Task<Guid> Create([FromBody] CreateTodoListCommand command)    {        var createdTodoList = await _mediator.Send(command);        // 出于演示的目的,这里只返回创建出来的TodoList的Id,        // 实际使用中可能会选择IActionResult作为返回的类型并返回CreatedAtRoute对象,        // 因为我们还没有去写GET方法,返回CreatedAtRoute会报错(找不到对应的Route),等讲完GET后会在那里更新        return createdTodoList.Id;    }}

    POST TodoItem

    类似TodoListController和CreateTodoListCommand的实现,这里我直接把代码贴出来了。

    CreateTodoItemCommand.cs

    using MediatR;using TodoList.Application.Common.Interfaces;using TodoList.Domain.Entities;using TodoList.Domain.Events;namespace TodoList.Application.TodoItems.Commands.CreateTodoItem;public class CreateTodoItemCommand : IRequest<Guid>{    public Guid ListId { get; set; }    public string? Title { get; set; }}public class CreateTodoItemCommandHandler : IRequestHandler<CreateTodoItemCommand, Guid>{    private readonly IRepository<TodoItem> _repository;    public CreateTodoItemCommandHandler(IRepository<TodoItem> repository)    {        _repository = repository;    }    public async Task<Guid> Handle(CreateTodoItemCommand request, CancellationToken cancellationToken)    {        var entity = new TodoItem        {            // 这个ListId在前文中的代码里漏掉了,需要添加到Domain.Entities.TodoItem实体上            ListId = request.ListId,            Title = request.Title,            Done = false        };        await _repository.AddAsync(entity, cancellationToken);        return entity.Id;    }}

    TodoItemController.cs

    using MediatR;using Microsoft.AspNetCore.Mvc;using TodoList.Application.TodoItems.Commands.CreateTodoItem;namespace TodoList.Api.Controllers;[ApiController][Route("/todo-item")]public class TodoItemController : ControllerBase{    private readonly IMediator _mediator;    // 注入MediatR    public TodoItemController(IMediator mediator)         => _mediator = mediator;    [HttpPost]    public async Task<Guid> Create([FromBody] CreateTodoItemCommand command)    {        var createdTodoItem = await _mediator.Send(command);        // 处于演示的目的,这里只返回创建出来的TodoItem的Id,理由同前        return createdTodoItem.Id;    }}

    验证

    运行Api项目,通过Hoppscotch发送对应接口请求:

    创建TodoList验证

    请求

    如何使用MediatR实现POST请求

    返回

    如何使用MediatR实现POST请求

    数据库

    如何使用MediatR实现POST请求

    第一条数据是种子数据,第二条是我们刚才创建的。

    创建TodoItem验证

    继续拿刚才创建的这个TodoList的Id来创建新的TodoItem:

    请求

    如何使用MediatR实现POST请求

    返回

    如何使用MediatR实现POST请求

    数据库

    如何使用MediatR实现POST请求

    最后一条是我们新创建的,其余是种子数据。

    “如何使用MediatR实现POST请求”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: 如何使用MediatR实现POST请求

    本文链接: https://lsjlt.com/news/302927.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • 如何使用MediatR实现POST请求
      本篇内容介绍了“如何使用MediatR实现POST请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!需求需求很简单:如何创建新的TodoLi...
      99+
      2023-06-22
    • .NET 6开发TodoList应用之使用MediatR实现POST请求
      目录需求目标原理与思路CQRS模式中介者Mediator模式MediatR实现引入MediatR实现Post请求验证创建TodoList验证创建TodoItem验证总结参考资料需求 ...
      99+
      2024-04-02
    • PHP如何使用cURL实现Get和Post请求
      使用cURL库可以很方便地实现PHP中的GET和POST请求。GET请求:```php// 创建cURL资源$ch = curl_i...
      99+
      2023-08-15
      PHP
    • php中POST请求如何使用
      今天小编给大家分享一下php中POST请求如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、什么是POST请求?PO...
      99+
      2023-07-05
    • vue如何实现发送websocket请求和http post请求
      这篇文章主要介绍vue如何实现发送websocket请求和http post请求,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!先给大家介绍下vue发送websocket请求和http...
      99+
      2024-04-02
    • 如何使用Ajax提交post请求
      如何使用Ajax提交post请求?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是ajaxajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,可以通过在后台...
      99+
      2023-06-08
    • SpringBoot 如何使用RestTemplate发送Post请求
      目录背景:1、待访问的API2、返回对象3、将发送Post请求的部分封装如下4、UserInfo对象5、在Service层封装将要发送的参数6、在控制器中调用service中的方法,...
      99+
      2024-04-02
    • Java 如何实现POST(x-www-form-urlencoded)请求
      目录JavaPOST(x-www-form-urlencoded)请求1、引入maven包2、代码实现3、POSTMAN参数组装使用post请求x-www-form-urlencod...
      99+
      2024-04-02
    • java如何实现post请求webservice服务端
      目录post请求webservice服务端1.例如我此时有一个wsdl文件2.点击row查看具体的发送参数3.代码实现3.1参数说明用post请求调用webservicepost请求...
      99+
      2024-04-02
    • PHP怎么使用cURL实现Get和Post请求
      使用cURL库可以轻松地实现GET和POST请求。GET请求:```php// 创建一个cURL资源$curl = curl_ini...
      99+
      2023-08-16
      PHP
    • 使用flask如何获取post请求参数
      目录前言概述1. application/jsonhttp 请求报文格式如下:使用curlpostman 请求flask如何获取请求体呢2. application/x-www-fo...
      99+
      2024-04-02
    • Java如何发起http请求的实现(GET/POST)
      前言 在未来做项目中,一些功能模块可能会采用不同的语言进行编写。这就需要http请求进行模块的调用。那么下面,我将以Java为例,详细说明如何发起http请求。 一、GET与POST...
      99+
      2024-04-02
    • java如何获取post请求的请求体
      在Java中,可以使用Servlet或Spring框架来获取POST请求的请求体。1. 使用Servlet:- 在Servlet中重...
      99+
      2023-09-14
      java
    • nodejs实现HTTPS发起POST请求
      准备用nodejs搞一个快速注册163邮箱的东西,需要在某一步的时候post数据到https,node的官方文档实在太简陋了,网上找了个差不多的例子,拿来改了改用。 var util = require...
      99+
      2022-06-04
      nodejs HTTPS POST
    • Java 使用 HttpClient 发送 GET请求和 POST请求
      目录概述认证方式基础认证Auth用户名密码认证Bearer Token 认证配置超时生成 RequestConfig设置超时时间概述 日常工作中,我们经常会有发送 HTTP 网络请求...
      99+
      2024-04-02
    • Java应用的Post请求怎么实现
      这篇文章主要介绍“Java应用的Post请求怎么实现”,在日常操作中,相信很多人在Java应用的Post请求怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java应用的Post请求怎么实现”的疑惑有所...
      99+
      2023-06-04
    • jquery如何发送post请求
      本篇内容主要讲解“jquery如何发送post请求”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“jquery如何发送post请求”吧! ...
      99+
      2024-04-02
    • jquery如何提交post请求
      这篇“jquery如何提交post请求”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“jqu...
      99+
      2024-04-02
    • 如何重试 HTTP POST 请求
      编程网今天将给大家带来《如何重试 HTTP POST 请求》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我...
      99+
      2024-04-04
    • 如何使用AutoMapper实现GET请求
      这篇文章主要讲解了“如何使用AutoMapper实现GET请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用AutoMapper实现GET请求”吧!需求需求很简单:实现GET请求获取...
      99+
      2023-06-22
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作