我已经尝试过使用MediatR的CQRS模式,我喜欢应用程序正在进行转换时的干净状态。在我看到和使用的所有示例中,我总是这样做的
await Mediator.Send(command);查询也是一样的
var data = await Mediator.Send(queryObject);我刚刚意识到还有Mediator.Publish,在我搜索之后,它似乎也在做同样的事情。我正在尝试理解Mediator.Send和Mediator.Publish之间的区别。我已经阅读了MediatR库文档,但我仍然不明白它们之间的区别。请帮助我理解其中的区别。
谢谢你的帮忙
发布于 2020-07-31 14:39:32
MediatR有两种分派的消息:
Send可能会返回响应,但不必这样做it.Publish从不返回结果。您通过_mediator.Send({command})将请求(有时称为命令)恰好发送到一个具体的处理程序。它可以是例如将新产品保存到数据库的命令。它通常是来自用户的请求(前端/API),有时也可能是系统中由其他服务以同步方式发出的内部命令。总是期望命令立即执行,并且您将收到一些正确的结果或错误,以便立即通知客户端一些失败。
您正在通过_mediator.Publish({event})将通知(通常称为事件)发布到零个、一个或多个处理程序。当您想要发布某些信息而您不知道谁需要时,您使用了通知。例如,成功将产品添加到您的仓库模块后发布的NewProductEvent。很少有其他环境想要订阅信息,例如,向客户端发送电子邮件,告知有新产品可用,或者在商店模块中为产品创建一些默认配置(可用于产品的支付和交付)。您可以以同步方式使用通知。所有数据将保存在一个事务中(产品和商店配置),或者您可以将某种异步模式与服务总线或/和一起使用。在第二种情况下(异步),当订阅您的通知的其他服务或上下文发生错误时,您必须手动处理这些情况。
示例场景:未创建默认配置。
例如,在微软的EShopOnContainers中订购微服务:github是使用mediatR的一个很好的例子。您将看到一个使用EF核心和ASP.NET的CQRS和DDD的示例。
https://stackoverflow.com/questions/63186625
复制相似问题