我已经尝试使用 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(使用前将#替换为@)