Domain driven design DDD:不可变对象也可以是实体吗? 我读过无数篇关于实体和价值对象之间差异的文章,虽然我认为至少在概念上我理解这两个概念是如何不同的,但是在一些文章中,作者认为一个特定的领域概念仅仅是VO,因为它是不可变的。(因此,它的状态永远不会改变,至少在特定的域模型中是如此)

Domain driven design DDD:不可变对象也可以是实体吗? 我读过无数篇关于实体和价值对象之间差异的文章,虽然我认为至少在概念上我理解这两个概念是如何不同的,但是在一些文章中,作者认为一个特定的领域概念仅仅是VO,因为它是不可变的。(因此,它的状态永远不会改变,至少在特定的域模型中是如此),domain-driven-design,Domain Driven Design,您是否同意如果一个对象的状态在特定的域模型中永远不会改变,那么这个对象就永远不应该是一个实体?为什么 谢谢如果需要标识,对象可以是实体。 根据DDD书,如果一个对象具有身份和生命周期,但不会随着时间的推移而改变,你也可以把这个对象看作一个事件。 你是否同意如果一个物体的状态永远不会改变 特定的域模型,那么这个对象永远不应该是一个实体? 为什么? 我想说,90%以上的实体在其生命周期中的某个时刻会发生变化。但有些实体可能是不可改变的,因为它们在该领域的性质——例如银行系统中的prepaid电话卡、

您是否同意如果一个对象的状态在特定的域模型中永远不会改变,那么这个对象就永远不应该是一个实体?为什么


谢谢

如果需要标识,对象可以是实体。 根据DDD书,如果一个对象具有身份和生命周期,但不会随着时间的推移而改变,你也可以把这个对象看作一个事件。 你是否同意如果一个物体的状态永远不会改变 特定的域模型,那么这个对象永远不应该是一个实体? 为什么?

我想说,90%以上的实体在其生命周期中的某个时刻会发生变化。但有些实体可能是不可改变的,因为它们在该领域的性质——例如银行系统中的
prepaid电话卡
TransferOrder

有些人还喜欢使他们的实体在默认情况下是不可变的,因为这有助于形成一个保留不变量并使域操作显式的设计:

两个字:是的,他们可以

埃里克·埃文斯(Eric Evans)在他的书中讲述了“连续性的线索”实体固有的。用外行术语来说,一个实体可以由前端发布为JSON,通过框架转换为DTO,然后转换为域对象,再转换为DTO,最后存储在数据库表中。在所有这些转换过程中,实体将很容易区分,因为它拥有一个或多个唯一的业务s ID

考虑到这一点,某些形式的不变性不是另一种连续性线程的形式吗?想象一下写时复制:所有不变性对象的副本都是形式上不同的对象,在其生命周期的不同点上表示它。然而,有一个唯一的id允许我们说它是同一个实体

现在,让我们谈谈不变性的“极端”形式:只读对象。实体可以是只读对象吗?当然,一个很好的例子是信用卡对账单

总结:

  • 一个实体可以以多种形式存在。事实上,在一个程序中,您几乎总是在不知不觉中拥有实体的多个表示形式
  • 实体的真正要求是存在唯一的业务标识(而不是用于技术目的的代理id),使其与其他实体区分开来
  • 实体可以是不可变的,无论我们谈论的是COW还是只读对象

哪本DDD书(我假设不是埃文的书,因为我不认为他在书中谈论事件)?@bckpwrld Evan的书,如果我没有弄错的话。虽然事件在当时不是一个明确的概念。所举的例子是一个付款,每个付款都有一个序列作为它的标识。在他的dddsample项目中,我记得HandlingEvent实现了DomainEvent。我看到有人在某处给出了审计日志的极好例子。这些项目结束时有一个id,但绝对不能更改。