MediatR 我何时以及为什么应该使用它? [关闭]

2024-01-25

以前可能有人问过,但我什至在官方网站上也找不到为什么我应该使用 MediatR 以及它解决了哪些问题?

  • 是因为我可以在构造函数中传递单个对象而不是多个接口吗?

  • 它是 ServicesBus 等的替代品还是竞争对手...

  • 基本上有什么好处以及解决什么问题

我想购买它,但我不清楚为什么我应该使用它。

非常感谢


是因为我可以在构造函数中传递单个对象而不是 大量的接口?

No.

它是 ServicesBus 等的替代品还是竞争对手...

No.

基本上有什么好处以及解决什么问题


除其他事项外,其中一个问题是MediatR正在尝试解决的是DI 构造函数爆炸在你的MVC 控制器

public DashboardController(
    ICustomerRepository customerRepository,
    IOrderService orderService,
    ICustomerHistoryRepository historyRepository,
    IOrderRepository orderRepository,
    IProductRespoitory productRespoitory,
    IRelatedProductsRepository relatedProductsRepository,
    ISupportService supportService,
    ILog logger
    )  

这是一个备受争议的话题,没有一刀切的解决方案,看看这个问题

如何避免依赖注入构造函数的疯狂? https://stackoverflow.com/questions/2420193/how-to-avoid-dependency-injection-constructor-madness

如果您想将依赖关系隐藏在更多抽象背后,那么此时您将需要查看所有选项,例如重构、进一步分离关注点或其他技术。

老实说,示例问题和解决方案给出了MediatR网站有点可疑,但它确实有它的用途。简而言之,您需要选择适合您和您的环境的内容。

中介者模式概述

中介者是一个对象,它决定对象之间如何以及何时交互。它封装了“如何”并根据状态、调用方式或您提供给它的有效负载来协调执行。

关于你的问题的精神,你真的应该看看这个网站:

使用 MediatR 简化开发并分离关注点 https://web.archive.org/web/20190118110711/https://blogs.msdn.microsoft.com/cdndevs/2016/01/26/simplifying-development-and-separating-concerns-with-mediatr/

MediatR 是中介者模式的开源实现 不会尝试做太多事情,也不会施展魔法。它可以让你 使用同步或 异步模式。它有助于减少耦合并隔离 请求完成工作和创建处理程序的问题 分派工作。

有关中介者模式的更多信息

您能以您自己的观点描述一下为什么要使用它吗

中介模式有帮助解耦 https://en.wikipedia.org/wiki/Coupling_(computer_programming)您的应用程序通过中介者(它是一个东西)进行通信。

通常一个程序是由大量的类组成的。然而,随着程序中添加更多的类,这些类之间的通信问题可能会变得更加复杂。这使得程序更难阅读和维护。此外,更改程序可能会变得困难,因为任何更改都可能影响其他几个类中的代码。

使用中介者模式,对象之间的通信被封装在中介者对象中。对象之间不再直接通信(解耦),而是通过中介者进行通信。这减少了通信对象之间的依赖性,从而减少了耦合。

在现代软件中,中介者模式通常存在于许多框架中,但是您可以创建自己的框架,或使用许多可用的框架之一。

从这里开始,我认为你可能应该做更多的研究,我的意思是通常你在研究它们之前就会弄清楚你需要这些东西,但是在这种情况下,我认为你真的需要找到一些很好的例子来知道你是否想要中介者模式,甚至更多MediatR library

Update

wired_in对此有一些非常实用的评论

MediatR 所做的只是为请求查找处理程序。那是 不是中介模式。在这种情况下,“调解人”并不 描述两个对象如何通信,它使用控制反转 已经在应用程序中使用并且仅提供 无用的抽象层,仅用于创建应用程序 更难从整体上进行推理。您已经通过以下方式实现了解耦 使用 IoC 的标准构造函数注入。我不明白为什么 人们对此表示认同。让我们创建多个复合根,这样我们 不必将接口放入我们的构造函数中。

and

OP 质疑 MediatR 的观点是完全合理的。 我听到的对该问题的最常见回答涉及解释 一般的中介者模式,或者它使调用代码 清洁工。前一种解释假设 MediatR 库 实际上实现了中介者模式,这一点还很不清楚。这 后者并不是在之上添加另一个抽象的理由 一个已经抽象的 IoC 容器,它创建多个组合 根。只需注入处理程序而不是服务定位它

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MediatR 我何时以及为什么应该使用它? [关闭] 的相关文章

  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • fopen_s 怎么会比 fopen 更安全呢?

    我正在处理遗留代码Windows平台 当我编译代码时VS2013 它给出以下警告 错误 C4996 fopen 该函数或变量可能不安全 考虑使用fopen s反而 要禁用弃用 请使用 CRT SECURE NO WARNINGS 详情请参见
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 最新 .Net MongoDb.Driver 的连接问题

    我创建了一个 MongoLab 沙箱数据库 我与 MongoChef 连接 效果很好 我通过 Nuget 安装了 MongoDB Driver 2 2 2 我编写了一些简单的 C 演示代码 但就是无法使其工作 连接字符串是直接从 Mongo
  • 警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)

    我的代码中有这个问题 bool CBase isNumber return id MID NUMBER bool CBase isVar return id MID VARIABLE bool CBase isSymbol return i
  • 为什么子函数不销毁GtkWindow?

    这是我的代码 void window first void enter window2 GtkWidget w gpointer data void quit GtkWidget w gpointer data void quit int
  • 在没有 epsilon 的情况下可以将浮点数与 0.0 进行比较吗?

    我知道 要比较两个浮点值 需要使用一些 epsilon 精度 因为它们并不精确 但是 我想知道是否存在边缘情况 我不需要那个 epsilon 特别是 我想知道这样做是否总是安全的 double foo double x if x lt 0
  • 嵌入资源文件的路径

    我的资源文件中有一个图标 我想引用它 这是需要图标文件路径的代码 IWshRuntimeLibrary IWshShortcut MyShortcut MyShortcut IWshRuntimeLibrary IWshShortcut W
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • .NET 5 EF Core SaveChangesAsync 因错误而挂起

    尽管这个问题有很多结果 但没有一个真正给我明确的答案 每次我尝试通过 AddAsync 和 SaveChangesAsync 方法插入错误数据 例如重复的主键 时 我都会看到以下日志 执行 DbCommand 失败 15 毫秒 我还在 SQ
  • C# 枚举到字符串自动转换?

    是否可以让编译器自动将我的 Enum 值转换为字符串 这样我就可以避免每次都显式调用 ToString 方法 这是我想做的一个例子 enum Rank A B C Rank myRank Rank A string myString Ran
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 从 DataRow 单元格解析 int [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何从 DataRow 单元格解析 int 值 Int32 Parse item QuestionId ToString 这段代码可以工作 但看
  • 如何检测应用程序正在运行的 .NET 版本?

    我尝试使用Environment Version ToString 确定目标计算机上正在使用什么 NET 框架 但安装了 4 0 版本时 它说我正在使用 NET 2 0 如何检测目标计算机上正在运行的 NET Framework 版本 En
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • Boost.asio和异步链,unique_ptr?

    我对异步编程不太熟悉 我有一个问题 我的问题如下 给出 boost asio 中 C 11 的 echo server 示例 http www boost org doc libs 1 60 0 doc html boost asio ex
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier
  • 在windows + opengl中选择图形设备

    我知道如何使用 openGL 打开窗口 使用 Win32 或其他工具包 但是当系统有2块显卡时 如何选择要渲染的图形设备 我的编程语言是 C 我专注于 Windows 但任何示例都将受到欢迎 编辑 也许更好地解释我的问题是个好主意 以便添加

随机推荐