【发布时间】:2017-03-24 12:22:54
【问题描述】:
您好,这是我第一次使用 DDD/CQRS。我已经阅读了多种知识来源,但我仍然有点困惑,也许有人可以帮忙:)
让我们假设我们有产品和客户(可能不同的有界上下文)的简单情况。 客户可以购买一种产品,并且他想查看他购买的所有产品。
在这种情况下,我意识到我需要一个 UserPurchasesView 视图模型:
- purchaseId(mongo 主键)
- 用户ID,
- 产品:{id, name, image, shortDescription, [也许是其他一些]}
- 奖品
- 时间戳
现在...问题是我的域正在产生类似 UserPurchasedProduct(userId, productId) 的事件。我可以用奖品、产品名称或其他东西来丰富活动,但不是所有领域。我已经到了丰富似乎是错误的地步。
在这一点上,我意识到我需要像 ProductDetailsView 这样的东西:
- productId(主键)
- 奖品
- 姓名
- 简短说明
- 徽标
此视图由以下事件维护:ProductCreated、ProductRenamed、ProductImageChanged
现在我们有两个选择...
- 当 UserPurchasedProduct 事件出现时查看 ProductDetailsView,获取所有需要的产品详细信息并将其保存在 UserPurchasesView 中以便更快地读取。这个解决方案看起来还不错,但它引入了一些额外的耦合,在我看来,这些视图在需要时无法很好地缩放。此外,在从事件存储中回复所有事件时,两个视图必须一起重建(在这种情况下重建也更加棘手)。
- 仅保留 UserPurchasesView 中的 productId 并在用户查询其购买时读取多个视图。这是一些必须在某处完成的额外处理。在前端、后端控制器或某些读取模型高级 API 中。更新:我还意识到我还需要在 UserPurchasesView 中至少保留产品的奖品和名称(以防它发生变化),但有时您需要购买时的价值,有时您需要最近的价值.场景取决于业务,但我们可以同时想象。
这些解决方案对我来说都不完美。我错了,我错过了什么还是只是这样做的方式?谢谢!
【问题讨论】: