领域驱动设计中“实体”的含义

Nab*_*bil -1 domain-driven-design

我今天参加了由一位非常著名且受人尊敬的作家、讲师和软件工程、架构和设计专家主持的网络研讨会。网络研讨会的主题是“增量架构”。这位名人表示,DDD 中的实体概念与数据库中的实体概念无关。这是埃里克·埃文斯 (Eric Evans) 在他 2003 年的原著中不幸选择的术语。我对他的解释并不满意,而且我发现他的声明可能会让任何试图在设计中使用 DDD 的人感到非常困惑。

我的问题:DDD 中的实体一词究竟是什么意思?- 如果不是数据库、ORM 框架、JPA、开发框架(Spring)等中对实体的很好理解和很好定义的概念。

广泛的软件架构研究。

这是一个关于 DDD 战略设计的问题。不涉及编码。

与我的问题无关。您允许使用关于 DDD 的主题标签,这是一种设计方法,而不是一种编码方法,但您坚持提出与代码相关的问题。DDD 与编码有何关系?

Voi*_*son 5

我的问题:DDD 中的实体一词究竟是什么意思?

Evan 在领域驱动设计的第 5 章(用软件表达的模型)中定义的实体。

实体(又名参考对象)...根本上不是由它们的属性定义的,而是由连续性和同一性的线索定义的。

主要由其身份定义的对象称为实体。

实体是在整个生命周期中具有连续性和独立于对应用程序用户很重要的属性的区别的任何事物。

它是对随时间变化的事物的记忆抽象。这是一个随时间变化的隶属函数,它在时间 t 将标识符映射到某个状态。它在域模型中用于表示发生变化的事物。

域模型中实体的一个例子可能是……关于堆栈溢出的问题。

领域驱动设计中“实体”的含义

当有人编辑文本、更改标题或投反对票时……这仍然是同一个问题,因为从过去的文本到现在的文本是有进展的。它改变时间,从有这个文本具有文本了。

域模型中的简单实体可能映射到关系数据库中的单行,但不一定如此。更准确地说,我们可以将实体的当前状态保存在一行中。但是,如果该状态包含一个集合,则该状态可能会分布在多行中,可能分布在多个表中。

您允许使用关于 DDD 的主题标签,这是一种设计方法,而不是一种编码方法,但您坚持提出与代码相关的问题。DDD 与编码有何关系?

如果源代码是设计,那么设计必然包括编码。领域驱动设计这本书的中间部分获得了最多的关注,涵盖了在代码中建模领域的主题。

说实话:提出的问题与权威答案相比,比更少。


Lou*_*uis 5

实体是具有标识的类型。id 可以是任何内容,但它必须对系统是唯一的,事实上,根据您所在的子域,身份/实体可能会发生变化。

例如:数据库可能有一个“用户”表,其中包含“名字”、“姓氏”等字段。在电子商务应用程序的购买子域的 DDD 中,您可能有“购物者”。这些购物者的 ID 可能是“名字姓氏”。在同一应用程序的“运输”子域中,您还将有“购物者”(或买家)的概念,但这次购物者的身份可能是“完整地址”。

因此,如果数据库实体只不过是具有标识符的数据分组,那么 DDD 实体就是一个概念。该概念与系统相关,用通用语言描述,并且是领域中许多功能将围绕其运行的中心参与者。填充 DDD 实体的数据通常来自多个数据表实体。