我一直认为地址数据是一个值对象,因为它是不可变的,并且它的相等性是由所有字段中的相同数据定义的。例如,付款的一部分中的帐单地址和送货地址是订单或履行的一部分。当有人更改她/他的地址时,需要一个新的地址数据。但是,我遇到的每个示例代码/应用程序都有一个地址数据作为实体,其DB表有自己的ID。如果系统想要跟踪所有业务活动/事件发生的所有地址,那将是有意义的。但是,我没有在那些示例代码/应用程序中看到这样的意图。我是否会错过这方面的一些事情?
答案 0 :(得分:1)
预先注意:有些域名的地址应该是一个实体,比如邮件服务;我们不谈论这些领域
根据我的经验,由于持久性,人们倾向于将地址实现为实体:将地址作为子实体持久保存到关系数据库比持久保存值对象更容易,因为实体ID起作用作为存储表中的主键。
但是,有一些策略允许将值对象存储为数据库实体,但仍然将其用作值对象,应该如此。 Vaughn Vernon在他的book,第6章子章节 Persisting Value Objects 中展示了如何做到这一点。
答案 1 :(得分:1)
你无法概括。
例子是一件事,现实世界的问题是另一回事。你不能说对于所有项目,一个解决方案都适合所有。
我将举一个关于聚合根的项目中的例子。 从逻辑上和法律上讲,子公司是其公司的延伸,例如。沃尔玛的总部设有税号,所有子公司和子公司都没有税号,而实际的东西都在这里出售。从逻辑上讲,为了申请政府资金或类似的东西,总部发送了对其子公司的请求。在这里,沃尔玛总部是一个集合根,其子公司是融资程序总量的一部分。 这是一个合乎逻辑的例子。
我所拥有的是,子公司可以在不知情总部的情况下合法申请国家资助!因此,HQ不再是聚合根,而是一个子公司。这非常不合逻辑,但这些都是业务要求。
这一点与您的价值客体问题相同。虽然您可以使用Address作为实体或值对象的示例,但是业务的要求决定了地址是什么,而不是逻辑什么。