Domain driven design 如何在DDD模式中识别特定项目的实体、ValueObject和聚合?

Domain driven design 如何在DDD模式中识别特定项目的实体、ValueObject和聚合?,domain-driven-design,clean-architecture,Domain Driven Design,Clean Architecture,我正在开发一个使用DDD模式的在线工作门户。 我已经找到了很多“对象”,比如用户、工作、角色、专业知识、经验范围、国家、州、城市、地址、订阅等 我的问题是我如何判断其中哪一个是实体、价值对象或集合?如果您曾经遇到过同样的困境,请告诉我 我已作出以下决定: 实体-用户、作业、订阅包 价值对象-角色、专业知识、经验范围、城市、州、国家 我知道,在进行DDD建模时,我们不应该考虑持久性,但有一个疑问浮出水面,即我存储在数据库中的值对象是否应该有id? 如果他们有一个id,他们是否违反了ValueObj

我正在开发一个使用DDD模式的在线工作门户。 我已经找到了很多“对象”,比如用户、工作、角色、专业知识、经验范围、国家、州、城市、地址、订阅等

我的问题是我如何判断其中哪一个是实体、价值对象或集合?如果您曾经遇到过同样的困境,请告诉我

我已作出以下决定:

实体-用户、作业、订阅包 价值对象-角色、专业知识、经验范围、城市、州、国家

我知道,在进行DDD建模时,我们不应该考虑持久性,但有一个疑问浮出水面,即我存储在数据库中的值对象是否应该有id?

如果他们有一个id,他们是否违反了ValueObjects的基本原则?如果我们没有用id保存它们,那么如何在外键字段中引用它们?

请帮我回答这些问题

如果您能建议上面提到的哪些对象是实体,哪些是价值对象,哪些是聚合,那就太好了。


提前感谢

在考虑DDD时,将DB映射留待稍后阶段。我知道我在重复你说的话,但只是因为这是真的。值对象可能由于其他原因(规范化、报告等)而具有DB id

首先提出您的对象模型,然后找出如何映射它。在某些(罕见的)情况下,如果有些东西太昂贵而无法正确映射,您可能需要稍微更改对象模型(我想不出一个例子,但我不想太极端)

所以,再一次,忘记DB——想想对象。实体具有id的原因是什么?我会这样说,然后可以检索和修改它,同时保持相同的id。 如果它是一个VO,那是因为该标识隐含在对象的值中。用户有id有意义吗?地址呢?还是一座城市?。。。视情况而定

以城市值对象为例,如果需要将其作为FK映射到“cities”表,则城市对象可能有一个id,但该id不公开。这是实施的细节。而用户id将被公开。例如,一个城市可能与一个省/州关联,而该省/州可能与一个国家关联

但在另一个应用程序中,用户可以添加城市及其相关信息,城市可能是一个实体,甚至是一个集合。这取决于你的要求

话虽如此,您提供的实体和VO列表总体上看起来还可以,但我不知道您的要求

回答第一个问题:您可以阅读,因为有一些关于什么是VO、实体或聚合的规则。困难来自于如何应用它们,经验是解决问题的方法

作为总结:

实体 许多对象基本上不是由其属性定义的,而是由连续性和同一性的线索定义的

价值对象 许多对象没有概念标识。这些对象描述事物的特征

聚集体
聚合围绕一个或多个实体绘制边界。聚合为其支持的任何操作对其所有实体强制执行不变量。

考虑DDD时,将DB映射留待以后的阶段。我知道我在重复你说的话,但只是因为这是真的。值对象可能由于其他原因(规范化、报告等)而具有DB id

首先提出您的对象模型,然后找出如何映射它。在某些(罕见的)情况下,如果有些东西太昂贵而无法正确映射,您可能需要稍微更改对象模型(我想不出一个例子,但我不想太极端)

所以,再一次,忘记DB——想想对象。实体具有id的原因是什么?我会这样说,然后可以检索和修改它,同时保持相同的id。 如果它是一个VO,那是因为该标识隐含在对象的值中。用户有id有意义吗?地址呢?还是一座城市?。。。视情况而定

以城市值对象为例,如果需要将其作为FK映射到“cities”表,则城市对象可能有一个id,但该id不公开。这是实施的细节。而用户id将被公开。例如,一个城市可能与一个省/州关联,而该省/州可能与一个国家关联

但在另一个应用程序中,用户可以添加城市及其相关信息,城市可能是一个实体,甚至是一个集合。这取决于你的要求

话虽如此,您提供的实体和VO列表总体上看起来还可以,但我不知道您的要求

回答第一个问题:您可以阅读,因为有一些关于什么是VO、实体或聚合的规则。困难来自于如何应用它们,经验是解决问题的方法

作为总结:

实体 许多对象基本上不是由其属性定义的,而是由连续性和同一性的线索定义的

价值对象 许多对象没有概念标识。这些对象描述事物的特征

聚集体 聚合围绕一个或多个实体绘制边界。聚合为其支持的任何操作对其所有实体强制执行不变量