我正在努力解决这个问题:如果一个概念是聚合根或只是一个实体(它是AR的一部分),如何判断? :
也许如果我需要引用其他AR中的实体,那么我需要将其设为AR:如果应用程序的某个地方我需要将某些内容链接到特定的订单行,那么订单行将成为AR。
或者它只是在生命周期方面,但如果是,我没有看到在AR中有一个实体的意义:它只是价值对象。
或者也许是因为一个实体可以改变AR然后我会把它推广为AR。
答案 0 :(得分:2)
在下面查看Udi Dahan博客文章和评论。
从技术角度来看,AR是事务边界。换句话说,一组实体应始终保持一致。按照这个定义,AR甚至不必具有ID。
从业务角度来看,它是您网域中的一个主要概念,是泛在语言的一部分,而实体则不必如此。
例如,对于汽车销售公司,汽车是AR,但引擎,车轮,轮胎等只是实体。但是,如果您通过汽车制造能力扩展您的汽车销售公司的软件,那么:引擎,轮胎等:在该软件的那一部分中可能是独立的AR。因此,如果您有一款销售汽车并制造汽车的软件,则有时会根据上下文使用不同的AR。一些对象在一个位置将是AR,而在另一位置将是实体。 DDD将此概念命名为“有界上下文”或“域”。
我认为您的困惑在于缺乏前期设计并且没有适当定义那些“边界上下文”。
答案 1 :(得分:0)
只能从AR内检索实体,不能从其他AR引用。因此,当您删除AR时,垃圾收集器还应该收集其中的所有entites / values对象。
我将AR需要检索的所有内容(按ID)检索。你说过(实体和AR)都有ID。如果实体有全局ID,那就意味着你想要通过id检索它们,所以它们也应该是AR。
实体示例可以是对帖子的回复。您想要检索一个帖子(AR),但是您没有按ID检索回复,您会收到来自AR的回复。但是如果你想评价回复,删除它,编辑或其他什么,那么它可能会变成AR,因为你想要在没有先检索帖子的情况下检索它(以及其他回复,这将是一个开销)。
尝试创建小型AR(内部没有大型实体树)。如果要从其他AR引用AR,请在示例FooAggregateId(1)
中按VO id进行。不要引用AR对象,否则你必须一次加载大量的AR,或者使用延迟加载。