【发布时间】:2021-10-23 11:39:58
【问题描述】:
在我基于 DDD 规则和模式创建的项目中,我目前正在我的域层中设计我的聚合。我想知道的是将包含多个不同聚合之间共享的枚举类(或其他实体)定义的文件放在哪里。
我将提供一个例子让我的问题更清楚:
假设我有两个聚合,ClubAggregate 和 MatchAggregate,它们的聚合根分别是 Club 和 Match。现在,Club 和 Match 都应该“拥有”League。我将 League 建模为 Enumeration 类,因为它存在的唯一原因是用于分类,它不包含任何业务逻辑并且可以被简单的枚举替换,但我以这种方式建模它以充分利用功能面向对象的。
我的项目中这些聚合的文件夹结构是 Domain/AggregatesModel/{aggregate_name},因此例如包含 Club 实体定义的“Club.cs”文件位于 Domain /AggregatesModel/ClubAggregate/Club.cs.
放置包含League Enumeration 类定义的“League.cs”文件的最佳位置是什么?
- 创建两个具有相同内容的不同“League.cs”文件并将每个文件放在每个 Aggregate 文件夹中? (我觉得这不对)。
- 仅将“League.cs”文件放在其中一个 Aggregates 文件夹中,并使用命名空间在其他 Aggregates 中引用它?
- 在 Domain/AggregatesModel 下创建一个名为“SharedEntities”的新文件夹,并将包含共享实体、枚举类等的每个文件都放入其中?
请详细说明在我的域层中组织文件的最佳方法是什么。
提前致谢。
【问题讨论】:
-
在我看来,您的
League更像是一个价值对象而不是一个实体。两个联赛是因为他们的价值还是因为他们的身份而平等? -
@rascio League 枚举类只有两个字段,Id 和 Name。 Id 和 Name 字段将它们彼此区分开来。此外,它们的值是预先定义的,并且它们在其生命周期内永远不会发生突变。它们的值仅在应用程序启动时在数据库中播种一次。
-
是的,所以如果您的应用程序不需要创建新实体,它们对我来说似乎是价值对象而不是真实实体。您也可以考虑为它们使用不同的方法,并执行类似stackoverflow.com/questions/45093394/… 的操作,而无需将它们放在数据库中(我不太了解 c#,但似乎它似乎是我在java中使用的方法,这样枚举条目将是id,名称只是与之相关的东西)
-
为了回答您的问题,您正在为此苦苦挣扎,因为您将它们视为一个实体,但它们不是。如果他们本来是一个实体,你应该为它创建一个包。相反,值对象不属于实体,例如在您的一个实体中有一个 VO
Meter并不意味着它拥有仪表的定义,VO 可以按其性质共享。 -
顺便说一句,为了回答您的问题,它应该保留在自己的包中,我会避免使用
SharedEntities,因为它没有意义,所有实体在某个特定的“共享”感觉,因为每个实体都可以使用自己的 id 与另一个实体建立关系。因此,或者您执行LeagueAggregate以使其明确成为独立聚合,或者您执行与所有实体共享的ValueObjects命名空间/包,但您应该避免选项 1 和 2,因为它是相同的概念,并且没有其他聚合拥有它。
标签: domain-driven-design aggregates