【问题标题】:Shared Enumeration classes between aggregates - folder and file structure in project聚合之间的共享枚举类 - 项目中的文件夹和文件结构
【发布时间】:2021-10-23 11:39:58
【问题描述】:

在我基于 DDD 规则和模式创建的项目中,我目前正在我的域层中设计我的聚合。我想知道的是将包含多个不同聚合之间共享的枚举类(或其他实体)定义的文件放在哪里。

我将提供一个例子让我的问题更清楚:

假设我有两个聚合,ClubAggregate 和 MatchAggregate,它们的聚合根分别是 ClubMatch。现在,Club 和 Match 都应该“拥有”League。我将 League 建模为 Enumeration 类,因为它存在的唯一原因是用于分类,它不包含任何业务逻辑并且可以被简单的枚举替换,但我以这种方式建模它以充分利用功能面向对象的。

我的项目中这些聚合的文件夹结构是 Domain/AggregatesModel/{aggregate_name},因此例如包含 Club 实体定义的“Club.cs”文件位于 Domain /AggregatesModel/ClubAggregate/Club.cs.

放置包含League Enumeration 类定义的“League.cs”文件的最佳位置是什么?

  1. 创建两个具有相同内容的不同“League.cs”文件并将每个文件放在每个 Aggregate 文件夹中? (我觉得这不对)。
  2. 仅将“League.cs”文件放在其中一个 Aggregates 文件夹中,并使用命名空间在其他 Aggregates 中引用它?
  3. 在 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


【解决方案1】:

DDD 对文件夹结构没有任何意见。

但是,不要在不同的命名空间中创建同一个 Enum 类的两个版本,除非您预计 Club 与 League 的 League.cs 存在分歧。

我会去共享文件夹。

【讨论】:

  • 感谢您的回复。你是对的,我不会在不同的命名空间中创建两个不同的 League 类,因为 League 在两个 Aggreagtes 中“意味着”相同的东西。我将使用 SharedEntities 文件夹解决方案。
猜你喜欢
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多