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

时间:2018-09-15 14:21:20

标签: domain-driven-design

我刚刚开始研究DDD,并且正在尝试研究某些情况。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

在原始DDD书中,Evans确实讨论了具有可以引用实体的值的可能性。 (第5章:“值对象甚至可以引用实体”)

我认为基本上每个人都放弃了这种做法。不变性太强大了。值通常只会引用其他值。除了引用实体之外,我们还包含实体 identifier

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

  

然后,货币成为其自身的汇总。

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

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

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

  

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

有两个可能的答案。

如果您的域是系统中货币处于活动状态的授权机构,则货币注册中心/货币交换应是您的域模型中的一流实体,并管理对所列货币的更改过程。

如果您的域不是授权机构,则只需缓存从授权机构获得的信息的副本。缓存通常是CRUD(PUT,GET,DELETE或PATCH)。