MediatR 发布和 MediatR 发送

Ton*_*nto 14 c# asp.net-core-mvc mediatr

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

await Mediator.Send(command);
Run Code Online (Sandbox Code Playgroud)

查询也是一样的

var data = await Mediator.Send(queryObject);
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助

zol*_*y13 29

MediatR 分派两种消息:

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

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

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

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

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

使用 mediatR 的一个很好的例子,你可以在微软的EShopOnContainers 中的订购微服务:github 中找到。您将看到CQRSDDD与 EF 核心和 ASP Net的示例用法。

  • 是的,但它也可能是应用程序/集成事件。EShopOnContainers 中提供了 mediatR 与事件总线集成的示例 (2认同)