首页 > 其他分享 ># 为什么要使用 MediatR 的 3 个理由和 1 个不使用它的原因

# 为什么要使用 MediatR 的 3 个理由和 1 个不使用它的原因

时间:2023-09-16 15:00:49浏览次数:29  
标签:理由 请求 处理 应用程序 处理器 使用 MediatR

# 为什么要使用 MediatR 的 3 个理由和 1 个不使用它的原因

为什么要使用 MediatR 的 3 个理由和 1 个不使用它的原因

https://codeopinion.com/why-use-mediatr-3-reasons-why-and-1-reason-not/

来自 Jimmy BogardMediatR 库 在过去的几年中,正在变得难以置信地流行,它也确实值的这样受到欢迎。它对自己的定义是:简单、平凡的 .NET 中介者模式的实现。那为什么那么多的开发者使用它呢?为什么你也应该使用 MediatR? 这里给出你至少需要考虑使用它的 3 个理由,还有一个为什么你不应该使用它的理由。

什么是 MediatR?

对于不熟悉 MdeidatR 或者不熟悉中介者模式的人来说:

对于软件开发人员来说,中介者模式定义了一个封装一组对象相互交互的对象。该模式是属于行为模式的一种,因为它可以扩展程序运行的行为。

原因 1: 解藕

多数演示 MediatR 的示例使用 ASP.NET Core,但是这并不意味着这是它创建价值的仅有框架。关键是从顶层的框架代码中解藕你的应用代码,而不用关心代码是否真正负责执行你的代码。

这里有一个使用 ASP.NET Core MVC 的示例。

关键点是创建一个请求对象,将它传递给 MediatR,由 MediatR 负责调用针对该请求对象的正确的处理器。

而这里的 PlaceOrderHandler 下单处理器对象完全不需要饮用任何类型或者 ASP.NET Core 的 API。

原因 2: 应用程序请求

至于为什么从顶层框架解藕,例如与 ASP.NET Core 解藕的重要性,问一下自己:我正在创建的是一个应用程序,还是一个 Web 应用程序?

这里的区别是:Web 应用程序是应用程序的一种。

应用程序可以有多种不同的输入。不是所有的请求都通过 HTTP 来实现。这里可能有多种方式与你的应用程序交互。

例如,你可能有需要重复执行的任务,在日常中的特定时间处理特定的操作。或者你可能存在通过消息中间件中抽取特定的消息来触发的任务。

在你的系统中,存在着通过各种方式来调用程序的行为,而不仅仅是通过 HTTP 请求。

在上面的 ASP.NET Core 示例中,我们将来自 HTTP 的请求最终转换成为一个应用程序请求对象。该应用程序请求对象完全从系统的顶级框架中解藕,从而可以在任何地方使用该对象。

使用 MediatR 来创建应用程序请求对象就可以跨越集成边界。

原因 3: 请求处理管线

一旦你能够通过应用程序请求对象来考虑问题,你就可以通过这些请求对象来深入考虑创建请求处理管线。

如果你熟悉 ASP.NET Core 的中间件的话,你会知道它的目的是定义 HTTP 请求的处理管线。

你还可以通过 MediatR 来创建同样的概念。有几种不同的方式可以创建它,这里介绍一种实现 IPipelineBehavior 的示例。

当调用 mediator.Send() 的时候,在调用你的基础处理器处理 (PlaceOrderHander) 之前。 RequestHandlerDelegate 负责调用 PlaceOrderHandler。这就使得我们可以在真正的处理之前切入处理,甚至可以短路而完全不调用它。比如说存在输入数据验证问题的时候。

这就意味着你可以创建任意数目的前置处理器,或者在执行实际行为之后的后置处理器。

# 为什么要使用 MediatR 的 3 个理由和 1 个不使用它的原因_Core

它难以置信的强大,支持你可以从你的应用程序请求中分离各种关注点。

为什么不使用它?

不使用 MediatR 的原因很简单,就是所有的处理都是进程内的。这意味着当调用 mediator.Send() 的时候,处理请求的相关处理器也是在同样的进程中执行。

NServiceBus 的作者 Udi Dahan 在我的响应下提出这个问题:

# 为什么要使用 MediatR 的 3 个理由和 1 个不使用它的原因_ASP_02

您认为驱使人们从基于 MediatR 的解决方案转向利用进程外消息传递的解决方案的痛点/动机是什么?

进程外的动机将是库功能中的所有附加构建(重试/失败/等)。更快地使用收到的 msg 响应到调用方(不是已处理)。

你有没有发现,在人们开始不使用进程内处理的时候,会因为没有这些东西而感到痛苦?如果是这样,根据你的经验,他们的旅程在多大程度上表现出来?

事件,最大触发器转移到进程外,我猜,在进程内,尽管每个处理程序都是独立的,但异常可能会使整个初始请求失败链失败(取决于异常处理)。一旦你感受到那种痛苦,我会说这就是转折点

用更简单的话来说,您希望每个事件处理程序独立执行

由于所有的处理都是进程内,这对于 Events/Notification (MediatR 称它们为 Nofifications ) 变得显而易见

对于 Notification 来说,它可以拥有 0 到多个处理器。不过,所有的的 Notification 处理器都是在相同的进程中执行的。

# 为什么要使用 MediatR 的 3 个理由和 1 个不使用它的原因_Core_03

在上面的示例中,如果你将一个 Notification 推入到 MediatR 中,这里有 3 个处理器处理该 Notification。它将会执行全部 3 个处理。不过,如果其中一个抛出了异常,会发生什么呢?

该异常会冒泡到你通过 MediatR 发布消息的地方。你将会如何处理它呢?你会重新发布该消息,以便在重新执行的时候成功执行它?如果任务之一是发送邮件呢?

你希望在隔离状态下执行事件处理。这就是转而使用进程外消息的时刻。

在这种场景下,你可能希望看一下 NServiceBus, Brighter, MassTransit, Rebus



冠军 


标签:理由,请求,处理,应用程序,处理器,使用,MediatR
From: https://blog.51cto.com/u_8130830/7493904

相关文章

  • IDEA使用连接JDBC连接带有phoenix加持的hbase数据库
    1、首先要保证自己的phoenix已经下载,且能够正常运行所谓正常运行,即能够正常地使用增删改查的相关操作,而不产生错误,比如不允许啥啥的情况;2、注意phoenix的命令格式(需要保证表中必须有primarykey)增加/修改(在phoenix里面,这两种情况被合并了,若是primarykey已经存在,那么就是修改......
  • java jdk 里自带的 javascript引擎的使用
    main方法代码:importjavax.script.ScriptContext;importjavax.script.ScriptEngine;importjavax.script.ScriptEngineManager;importjavax.script.ScriptException;publicclassMain{publicstaticvoidmain(String[]args)throwsScriptException{......
  • [腾讯云Cloud Studio实战训练营]无门槛使用GPT+Cloud Studio辅助编程完成Excel自动工
    @TOC前言chatgpt简单介绍:ChatGPT是一种基于GPT的自然语言处理模型,专门用于生成对话式文本。它是OpenAI于2021年发布的,在广泛的对话数据集上进行了训练,旨在提供更具交互性和适应性的对话体验。与传统的问答系统不同,ChatGPT设计用于处理连续的对话而不仅仅是单独的问题和回答。它可......
  • 使用Cpolar+ CFImagehost,搭建简洁易用的私人图床
    @[TOC]1.前言图片服务器也称作图床,可以说是互联网存储中最重要的应用之一,不仅网站需要图床提供的外链调取图片,个人或企业也用图床存储各种图片,方便随时访问查看。不过由于图床很不挣钱,各互联网大厂正在逐步关停所属的图床服务器,这也导致用户只能自己想办法,搭建自己的图床服务器。今......
  • springmvc中使用配置类进行配置,WebInit,WebConfig,SpringConfig
    2023-09-16导入的依赖<dependencies><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><de......
  • visual 调试问题 提示:”通常每个套接字地址(协议/网络地址/端口)只允许使用一次".
    错误指示:通信端口被占用了,导致通信无法进行。有可能是已经启动了一个程序,还有一种可能是端口被别人占用了查看启动程序的端口使用情况:比如端口:801.netstat-aon|findstr“80”查看占用8086端口的进程 2.查找占用端口句柄的程序:tasklist|findstr18244 3.任务管理......
  • 如何使用 Harbor 和 Trivy 快速扫描镜像漏洞
    如何使用Harbor和Trivy快速扫描镜像漏洞奇妙的Linux世界 2023-09-1611:24 发表于重庆 以下文章来源于Harbor进阶实战 ,作者键客李大白Harbor进阶实战.本公众号主要分享云原生领域Harbor私有镜像仓库在实际业务场景中的一些知识。harbor企业级高可用设计、备份......
  • springmvc中异常配置的两种方式,一种使用注解配置,一种使用控制器配置
    2023-09-16方式一springmvc.xml<!--配置异常处理器--><beanclass="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><propertyname="exceptionMappings"><props>......
  • 【心得】TP6使用Redis进行处理商城秒杀
    书接上回,上次分享了TP6对于Redis的基础使用,那么今天就为大家带来一个简单的,使用场景很高的心得代码风险,Redis在商城秒杀的使用,该代码为简单分享能解决一些基础后续可以根据自己所需进行业务重构。读这篇文章的我就默认大家已经环境都安装好了,如果不知道怎么安装的可以传送到这里......
  • 无法使用Android studio解决方法(AMD处理器)
    无法使用Androidstudio解决方法前提:你的电脑是AMD处理器,想使用Androidstudio,自己的电脑系统是win10家庭版,在百度找到勾选hyper-v就能用,然后发现在自己的电脑上面找不到,又要去BIOS界面里面更改配置发现也不行,这些坑我都踩过。。。。那请你接着往下看当初刚上大一对于电脑硬件有......