MediatR 发布和 MediatR 发送

2024-01-28

我已经尝试使用 MediatR 的 CQRS 模式,并且喜欢正在处理的应用程序正在转换的干净状态。 在我见过和使用的所有例子中,我总是这样做

await Mediator.Send(command);

查询也是一样的

var data = await Mediator.Send(queryObject);

我刚刚意识到还有 Mediator.Publish,搜索后在我看来它也在做同样的事情。我试图了解 Mediator.Send 和 Mediator.Publish 之间的区别。 我已阅读 MediatR 库文档,但我仍然不明白它们之间有什么区别。 请帮助我理解其中的区别。

感谢您的帮助


MediatR 有两种发送的消息:

  • 请求/响应消息,分派到单个处理程序
  • 通知消息,分派给多个处理程序
  • Send可以返回响应,但不必这样做。
  • Publish从不返回结果。

您正在发送请求(有时称为commands) by _mediator.Send({command}) 精确到一个具体的处理程序。它可能是例如将新产品保存到数据库的命令。它通常是来自用户(前端/API)的请求,有时也可能是系统中其他人给出的内部命令service以同步方式。总是期望该命令将立即执行,并且您将收到一些正确的结果或错误,以立即通知客户端某些失败。

您正在通过以下方式发布通知(通常称为事件)_mediator.Publish({event})零个、一个或多个处理程序。当您想要发布某些信息但不知道谁需要这些信息时,您可以使用通知。例如。NewProductEvent成功将产品添加到您的产品后发布仓库模块。很少有其他上下文想要订阅信息,例如向客户发送电子邮件,告知有新产品可用,或者为您的产品创建一些默认配置商店模块(该产品可以付款和送货)。您可以以同步方式使用通知。所有数据将保存在一项事务(产品和商店配置)中,或者您可以使用某种异步模式服务巴士 or/and sagas https://microservices.io/patterns/data/saga.html。在第二种情况(异步)中,当订阅您的通知的其他服务或上下文中发生错误时,您必须手动处理情况。

示例场景:未创建默认配置。

  • 如果您有几个上下文的一个事务(同步方式),您将收到一个错误,记录该错误并将其返回给用户/客户端。
  • 以异步方式,您可以在将新产品保存到数据库后发送事件。您不希望产品在系统中处于半错误状态。因此,首先我建议在“草稿”状态下创建它,并等待通知您已成功创建配置的事件,然后将状态更改为“新建/正确”等。

您将在例如中找到使用 mediatR 的一个很好的例子订购微服务容器上的网上商店 https://learn.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/由微软:github https://github.com/dotnet-architecture/eShopOnContainers。您将看到一个示例用法CQRS https://martinfowler.com/bliki/CQRS.html and DDD https://martinfowler.com/bliki/DomainDrivenDesign.html与 EF core 和 ASP Net。

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

MediatR 发布和 MediatR 发送 的相关文章

随机推荐

  • 需要帮助了解 Firebase Storage CDN

    我正在构建一个有声读物应用程序 并将音频文件上传到 Firebase 存储上 我的问题是我在旧金山和多伦多经历了不同的表现 我的印象是 Firebase Storage 具有内置 CDN 如果是这样 我需要在某处启用它吗 如果没有 如何将
  • Breeze:EFContextProvider/Breeze 控制器和服务层

    使用 Breeze 时 我想知道如何将其与处理电子邮件通知 审核日志 业务验证 即客户必须存在 等事务的服务层集成 例如 假设有以下场景 public class SalesAppRepository private readonly EF
  • 单个 APN 是一个组织中多个应用程序的关键

    我的组织维护多个应用程序 并且对于如何使用 APN 密钥存在困惑 我们正在使用 firebase 发送推送通知 So far we have two apple keys for two different applications But
  • 到 .accdb 文件的 ODBC 连接

    我正在尝试从我一直在处理的统一项目中访问 Microsoft Access 数据库文件 但它不断抛出异常 因为它无法找到该文件并且没有选择标准河流 代码 using UnityEngine using UnityEngine UI usin
  • DynamoDB 预配的写入容量单位经常意外超出

    我相信我了解写入 读取容量单位 它们的工作原理以及在 DynamoDB 中的计算方式 证明就是我明白this https linuxacademy com howtoguides posts show topic 20310 how to
  • 从 Clojure Repl 和 Leiningen 运行测试

    作为 clojure 的新手 我使用 leiningen 创建了一个示例项目 lein new app first project 这给了我这个目录 doc intro md LICENSE project clj README md re
  • Android 将 Drawable 和 Shape 合并为一个 Drawable(以编程方式)

    我正在设置android drawable单选按钮的编程方式如下 Drawable unchecked getResources getDrawable R drawable ic room car Drawable d getResour
  • 为什么执行指针追踪时该跳转指令的开销如此之大?

    我有一个程序可以执行指针追逐 https en wikichip org wiki pointer chasing我正在尝试尽可能优化指针追逐循环 我注意到perf record检测到函数中约 20 的执行时间myFunction 用于执行
  • 带有标识符 LabelServices 的库丢失(可能已被删除?)/出现问题。请重新加载

    我已将其发布在 google apps script issues 上 但没有任何回应 我变得绝望 因为我所有的工作表和脚本都崩溃了 所以我希望这里有人可能遇到过这个问题 并且可以告诉我如何处理这个问题 我的一些现有脚本 包括电子表格中的一
  • 将 Typeahead.js 与 ASP.Net Webmethod 集成

    我正在寻找将 Typeahead js 与 Asp Net Webmethod 一起使用的示例 我有来自的例子http twitter github io typeahead js examples http twitter github
  • SQL Server 2012-数据库主数据库中的创建数据库权限被拒绝(错误 262)

    我想使用 SQL Server Management studio 在 SQL Server 2012 上创建一个新数据库 我以管理员身份运行 SQL Server Management studio 并使用 Windows 身份验证登录
  • 性能问题 - iOS 中的 plist 与 sqlite

    我需要跟踪一些变量并经常保存它们 我不需要复杂的搜索和排序 只需要简单的读 写 plist 和 sqlite 的读 写性能有什么区别 除了上述两种方法之外 我还应该使用 core data 吗 请给我一些提示 Thanks 在 SQlite
  • 无法加载 libhdfs

    尝试使用 pyarrow 访问 hdfs 文件但无法使其工作 下面是代码 非常感谢您 rxie cedgedev03 code python Python 2 7 12 Anaconda 4 2 0 64 bit default Jul 2
  • 电子如何允许不安全的https

    Loading https github com https github com例如 工作正常 但是加载不安全的https 页面显示为空 我做了一些研究并尝试了 3 个标志 webSecurity allowDisplayingInsec
  • 如何清除服务器端文件上传文本(c#)

    我想清除文件上传的文件路径 文件上传位于更新面板内 我正在使用AsyncFileUpload 如何清除文件并更改文件上传的背景颜色 btnAudUpload Click 方法 string filename FileUpload FileN
  • gcc优化说明

    出于黑客的好奇心 我想知道如何gcc能巧妙地优化下面的功能吗 int c int i j 0 for i 0 i lt 10 i j i return j objdump D c o下面是针对arm的 但x86在逻辑上没有什么不同 0000
  • 清除标准输入缓冲区?

    我正在编写一些代码并使用 fgets 来获取用户输入 然后我在代码上编写了一个循环 以不断要求用户输入 直到用户打印退出 但第二次询问时 它写了 2 次 请输入您的输入 而不是 1 次 并且第一次没有等待我的输入 所以 我用谷歌搜索它 发现
  • 如何使用原子操作切换一个文档中的布尔字段?

    有没有办法通过原子操作来切换 MongoDB 中一个文档的布尔字段 说 用Python cl update id toggle field 1 目前 我认为通过一次手术不可能做到这一点 按位运算符 http www mongodb org
  • Oracle 中的匿名 TABLE 或 VARRAY 类型

    在 Oracle 中 我有时想创建诸如此类的构造 SELECT FROM TABLE STRINGS a b c SELECT FROM TABLE NUMBERS 1 2 3 显然 我可以为上述声明我自己的类型 我可以选择TABLE an
  • MediatR 发布和 MediatR 发送

    我已经尝试使用 MediatR 的 CQRS 模式 并且喜欢正在处理的应用程序正在转换的干净状态 在我见过和使用的所有例子中 我总是这样做 await Mediator Send command 查询也是一样的 var data await