0

在领域驱动设计中,有一个聚合根引用了内部实体。

Aggregate Root 是一个具有全局身份的实体(每个人都可以使用它的 id)。聚合根具有指向本地对象(实体)的链接。

假设这里的实体是 Hibernate @Entities(比方说)

假设我们有聚合根“用户”,其中包含“地址”实体作为对象(实际上也是一个实体)

问题是:如何使本地实体仅具有本地身份。我的意思是,没有任何障碍可以阻止任何人通过其 ID 使用本地实体(如地址)。(所以这个身份根本不是本地的,而是全球的)。那么,本地化的方法是什么?

4

3 回答 3

4

好吧,我不认为这是公共字段或属性或某些访问限制机制的问题,我认为“本地身份”的方式意味着聚合边界之外的对象不能以有意义的方式使用该本地身份或有用的方式(例如,他们不能使用该身份来检索该对象或将其保存到数据库或任何其他操作)。该身份对外部世界没有任何意义,它仅在该聚合中是唯一的。另一个例子,什么可以保证聚合边界之外的对象不会持有对内部对象的引用(这违反了聚合的原则之一),除非这些对象是 VALUE OBJECTS,否则每次都不是这样。如果我想说几句话:不要

于 2013-03-06T23:31:08.253 回答
3

所有实体,包括根,都有一个身份。仅应“全局”使用聚合根的标识这一事实是代码本身无法轻易实施的。特别是在关系数据库中,每条表记录都会有一些键,无论该记录是否存储聚合根、实体或值对象。因此,由开发人员决定哪些数据库身份是域的一部分,哪些不是。

于 2013-03-05T23:11:18.290 回答
2

聚合根中的实体应该只有本地身份。出于所有意图和目的,数据库表不需要有主键。当聚合体被水合时,应根据它们与 AR 的链接来获取 AR 中的实体。但即使FK 也不需要在本地实体中表示,因为基于本地实体与 AR 的包含,连接是显而易见的。

由于如果表上没有 PK,大多数数据库系统都会抱怨,因此您可以为此添加一个,但您可以在实体设计中忽略它。因此,实体中的 PK 将没有属性。然后有人可以访问该实体的唯一方法是通过数据库,因为您的代码中应该没有办法这样做。

于 2013-03-06T04:52:24.797 回答