【问题标题】:How to handle a Value Object referencing an Entity?如何处理引用实体的值对象?
【发布时间】:2018-09-15 14:21:19
【问题描述】:

我刚刚开始研究 DDD,并且正在尝试研究一些场景。

我有一个带有 ProductName(值对象)和 ProductPrice(值对象)的产品(实体)。产品价格然后有一个金额(十进制)和一个货币。

我的问题是关于货币的。首先,我将它设计为一​​个值对象,但应该可以将新货币添加到系统中,并且应该可以在某种 GUI 中列出它们。换句话说,我似乎需要一个货币存储库。在我看来,这意味着 Currency 应该被设计为一个实体。

但是,现在我有一个引用实体(货币)的值对象(产品价格)。这应该如何处理?我的猜测(我不确定)是我删除了产品价格中对货币实体的引用,而是添加了货币的 ID(美元、欧元等)。然后,货币成为它自己的集合。

这是 DDD 中有效且首选的设计,还是应该以其他方式完成?

【问题讨论】:

  • 您好,欢迎来到 SO :) 我对 DDD 不熟悉,但我想您的问题可能会通过一张总结您的情况的图片更清楚。总体思路是make it easy 让人们了解您的问题,以便他们最终可以帮助您:) 您可以使用markdown 使您的帖子尽可能好。

标签: domain-driven-design


【解决方案1】:

在最初的 DDD 书中,Evans 确实讨论了拥有可以引用实体的值的可能性。 (第 5 章:“VALUE OBJECTS 甚至可以引用 ENTITIES”)

我认为,总的来说,每个人都放弃了这种做法。不变性是一个太强大的想法。值通常只会引用其他值。我们不引用实体,而是包含实体标识符

因此,通常的解决方案是将货币代码建模为一个值,并将该值存储(副本)在您的价格值中。

货币然后变成它自己的集合。

我不希望这会发生。货币如何随时间变化?

我想你会发现货币是相当静态的:随着时间变化的是CurrencyExchange——目前列出了哪些货币?今天的汇率是多少?两年前的汇率是多少?截至周四,哪些政治单位更喜欢这种货币?

货币在本质上更接近计量单位:英尺、英寸、米、磅、升秒。米是长度尺寸的计量单位;货币是“货币”维度的计量单位。

您如何处理可以将新货币添加到系统中,以及如何在 GUI 中选择货币?

对此有两种可能的答案。

如果您的域是系统中货币的活跃机构,那么货币注册/货币兑换应该是您的域模型中的第一类实体,并管理对所列货币的更改过程。

如果您的域不是权威,那么您只需缓存您从权威获得的信息的副本。缓存通常是 CRUD(PUT、GET、DELETE,也许是 PATCH)。

【讨论】:

  • 感谢您的回复。我同意货币类别可能不会改变。但是,您如何处理可以将新货币添加到系统中,以及如何在 GUI 中选择货币?我想不允许有值类型的存储库?您是否建议在仅处理 CRUD 的不同(更简单)有界上下文中将货币从 DB 加载到 GUI?
猜你喜欢
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2011-10-20
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
相关资源
最近更新 更多