domain-driven-design - 事件和命令消息中的元数据

标签 domain-driven-design cqrs

我很想知道你们如何在 cqrs 解决方案中合并有关命令/事件消息的元数据。例如,我想知道谁、何时、哪个主机等生成了该命令。我不想将这些放入消息本身。

假设在网络应用程序中,用户创建了一个购物车 CreateShoppingCart { CartID, UserID } 。然后向其中添加项目,AddItem { CartID, ItemID, Amount, etc } 。我想准确记录用户单击“添加到购物车”按钮的时间。

  1. 我可以将其添加到一些Dictionary<string, object> Headers { get; set; }中属性(property)。该属性可以位于 BaseMessage 类中。
  2. 我可以依靠消息传递框架(例如 NServiceBus)并将这些数据添加到消息上下文中的消息 header 中。
  3. 为此信息发送单独的命令。类似 LogCommandDetails { CommandID: 'id of AddItem command', DateTime, Some other meta data } 。当处理这个comamnd时,我可以更新ItemAdded事件的投影并将这些数据添加到投影中。

你有什么想法?

谢谢

最佳答案

通常,此信息存储在消息 header 中,这是选项 2。这正是消息 header 的用途。请注意,从消息传递框架的角度来看的消息与域中的消息(消息传递框架中的消息正文)之间存在细微差别。

但是,辨别什么是数据和什么是元数据可能很困难。我在日期等方面遇到了这个问题。例如,时间戳是否与事件元数据或正确的域数据相关联?如果执行某些业务逻辑需要时间戳怎么办?在您的示例中,您是否需要记录用于报告或审计目的的日期,或者域运行所需的日期?在前一种情况下,使用 header ,在后一种情况下,将日期放在消息正文中。

关于domain-driven-design - 事件和命令消息中的元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13591354/

相关文章:

domain-driven-design - 域服务是域模型的一部分吗?

c# - 什么时候领域驱动设计就足够了?

CQRS:通过命令而不是事件启动进程管理器

domain-driven-design - 我可以使用不同的数据库作为 Wolkenkit 读取模型吗?

CQRS 异步命令总线与同步

c# - 在持久化聚合之前发布领域事件是否安全?

c# - DDD 数据库优先。如何处理聚合

design-patterns - 域类中的 HTML 格式化

design-patterns - 重播事件以进行调整

mongodb - 如何设计 MongoDB 数据模型来存储 Event Sourcing 事件