差异聚合根/实体

时间:2014-09-09 14:54:26

标签: entity domain-driven-design domain-model aggregateroot

我正在努力解决这个问题:如果一个概念是聚合根或只是一个实体(它是AR的一部分),如何判断? :

  • 他们都得到了ID
  • 它们都由实体或价值对象
  • 组成

也许如果我需要引用其他AR中的实体,那么我需要将其设为AR:如果应用程序的某个地方我需要将某些内容链接到特定的订单行,那么订单行将成为AR。

或者它只是在生命周期方面,但如果是,我没有看到在AR中有一个实体的意义:它只是价值对象。

或者也许是因为一个实体可以改变AR然后我会把它推广为AR。

2 个答案:

答案 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,或者使用延迟加载。