【发布时间】:2019-05-24 12:22:32
【问题描述】:
我很好奇如何在事件源聚合根的读取模型中连接来自多个聚合根的数据。可以尝试举个简单的例子:
如果我有一个名为 Cart 的聚合根,它在其事件流中支持以下事件(括号中的属性 - 请记住,这是一个简单的示例):
AddProductToCart(cartId: Int, productId: Int)
RemoveProductFromCart(cartId: Int, productId: Int)
AddUserLicenseToProduct(cartId: Int, productId: Int, userId: Int)
RemoveUserLicenseFromProduct(cartId: Int, productId: Int, userId: Int)
EmptyCart(cartId: Int)
使用来自此事件流的数据投影读取模型时可以。例如,我可以投影一个看起来像这样的购物车对象:
Cart(cartId: Int, products: List[Product])
Product(productId: Int, userLicenses: List[UserLicense])
UserLicense(userId: Int)
但是如何将来自另一个上下文中另一个聚合根的数据连接到此购物车投影中。例如,如果我想使用来自另一个上下文中的 Product 聚合根的数据来扩展读取模型。假设我想用 productName 和 productType 扩展它。
考虑到我们在分布式系统中工作,其中 Product 和 Cart 将存在于不同的服务/应用程序中。
我想一种解决方案是将数据包含在命令和事件中。但是,如果一个具有来自多个聚合根的数据的更大读取模型,这似乎不能很好地扩展。还必须能够核对和重建读取模型。
我想另一种解决方案是将数据从其他聚合根复制到其他应用程序/服务/上下文的存储中。例如,将 productName 和 productType 数据复制到属于 Cart 应用程序的存储中,但不让它成为 Cart 事件流的一部分。然后,购物车应用程序必须侦听事件(例如 ProductCreated、ProductNameChanged)以保持数据更新。我想这可能是一个可行的解决方案。
【问题讨论】:
标签: domain-driven-design cqrs event-sourcing