CQRS 项目是否需要像 NServiceBus 这样的消息传递框架?
简短的回答:不。
这是我第一次听说 eulerfx 提到的“读取模型模式”。这是一个很好的名字,但还有更多:
“查询”部分背后的总体思路是查询数据的非规范化视图。在“读取模型模式”链接中,您会注意到用于填充读取模型的查询正在做一些提升。在上面提到的示例中,所需的数据操作并没有那么复杂,但如果它变得更复杂怎么办?这就是去规范化的用武之地。当您执行“命令”部分时,下一个操作是对数据进行去规范化并存储结果以便于阅读。所有繁重的工作都应该由您的域完成。
这就是您询问消息传递的原因。这里有几种技术:
- 同一个数据库、同一个表、不同列中的非规范化数据
- 同一数据库中的非规范化数据,不同的表
- 不同数据库中的非规范化数据
那就是存储。一致性如何?:
最简单的解决方案(快速获胜)是对域中的数据进行非规范化,然后在通过存储库保存域对象后,立即将非规范化数据保存到相同的数据存储、相同的表、不同的列。100% 一致,您可以立即开始读取非规范化数据。
如果你真的想要,你可以创建一组单独的对象来传输该数据,但是只编写一个简单的查询层来返回数据访问框架提供的一些数据承载对象会更简单(在 .Net 的情况下,这将是DataRow
/ DataTable
)。绝对没有理由变得花哨。总会有例外,但是您可以继续编写数据容器。
为了最终的一致性,您将需要某种形式的排队和相关处理。您可以推出自己的解决方案,也可以选择服务总线。这取决于您和您的时间/技术限制:)
顺便说一句:我在这里有一个免费的开源服务总线:
任何反馈都将受到欢迎。但是任何旧的服务总线都可以(MassTransit / NServiceBus / etc.)。
希望有帮助。