如何以DDD模式识别特定项目的实体,ValueObject和聚合?

时间:2019-02-06 05:34:17

标签: domain-driven-design clean-architecture

我正在使用DDD模式开发在线工作门户。 我发现了很多“对象”,例如用户,工作,角色,专业知识,体验范围,国家/地区,州,城市,地址,订阅等。

我的问题是我如何确定这些是实体,价值对象还是集合?如果遇到同样的难题,请告知我。

我已经做出以下决定:

实体-用户,工作,SubscriptionPackage ValueObjects-角色,专业知识,体验范围,城市,州,国家/地区

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

如果它们具有ID,是否不违反ValueObjects的基本原理,并且如果我们不使用ID保存它们,那么如何在外键字段中引用它们?

请帮助我回答这些问题。

如果您可以建议上面提到的哪些对象是实体,哪些是价值对象以及哪些是合计的。

提前感谢

1 个答案:

答案 0 :(得分:2)

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

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

因此,再一次,不用考虑数据库-考虑对象。实体出于什么原因拥有ID?我会说,这样以后可以在保留相同ID的情况下对其进行检索和修改。 如果它是VO,则是因为该标识隐含在对象的值中。用户拥有ID是否有意义?地址呢?还是城市?...取决于。

以城市值对象为例,如果您需要将其作为FK映射到“ cities”表,则您的City对象可能会有一个ID,但不会公开该ID。这是实现的细节。而用户ID将被公开。例如,一个城市可能链接到一个省/州,而一个国家/地区。

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

话虽如此,您提供的实体和VO的列表通常看起来不错,但我不知道您的要求。

要回答第一个问题:您可以阅读Entities, Value Objects, Aggregates and Roots,因为对于VO,实体或聚合有一些规定。困难来自如何应用它们,而经验就是解决问题的方法。

摘要:

实体

许多对象并不是从属性上定义的,而是由连续性和身份性来定义的。

值对象

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

聚合

集合在一个或多个实体周围划定了边界。聚合为其支持的任何操作为其所有实体强制执行不变式。