如何处理引用实体的值对象?



我刚刚开始研究DDD,并试图研究一些场景。

我有一个产品(实体(,其中包含产品名称(值对象(和产品价格(值对象(。然后,产品价格具有金额(十进制(和货币。

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

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

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

在最初的DDD书中,Evans确实讨论了拥有可以引用实体的值的可能性。 (第5章:"值对象甚至可以引用实体"(

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

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

然后,货币成为自己的聚合。

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

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

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

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

对此有两种可能的答案。

如果您的域是系统中处于活动状态的货币的颁发机构,则货币注册机构/货币兑换应该是域模型中的第一类实体,并管理对所列货币的更改过程。

如果您的域不是颁发机构,则只需缓存从颁发机构获得的信息的副本。 缓存通常是 CRUD(PUT、GET、DELETE,也许是 PATCH(。

最新更新