贫血领域模型和实体之间的区别

3
我正在努力理解DDD,并阅读了Eric Evans关于领域驱动设计和Julie Lerman的博客,他们将以下内容描述为:
- Anemic Domain Model是一种以状态管理为中心的模型。适用于CRUD操作。 - Entity是一个可变的类,具有标识用于跟踪和持久性。
它们肯定都是用于相同的目的,还是说我完全误解了?两者之间有什么区别?我已经读到过,无血统领域模型常用于表示数据库模式,但实体也是这样吗?
例如,一个名为“Customer”的表格包含:
CustomerId int
Forename varchar(50)
Surname varchar(50)
IsActive bit

据我所知,用贫血的领域模型表示会是这样:

public class Customer
{
  public int CustomerId { get; set; }
  public string Forename { get; set; }
  public string Surname { get; set; }
}

过去我的经验告诉我,一个实体也可以用一系列getter和setter属性来表示,就像Entity Framework一样。这两个概念(实体和贫血领域模型)都是可变的吗?谢谢,DS。

1
我认为它们来自两个不同的世界。更好的比较是贫血模型与富领域模型,或者数据传输对象与实体/值对象/聚合根。 - Ilya Palkin
这里的问题在于我们如何将DTO /实体和值对象视为相同,因为值对象是不可变的,而实体和DTO则不是。它们可以改变状态,这是可以接受的。 - Dr Schizo
贫血领域模型和数据传输对象(DTO)没有行为。富领域模型和实体/值对象/聚合根有行为。你说得对,实体、值对象和聚合根是不同的,但它们通常都有行为。 - Ilya Palkin
如果您在域中使用EF实体,您将永远无法获得所需的域实体,这几乎是不可能的。例如,我对您的“Customer”类所做的第一个修改将是使“CustomerId”只读,甚至完全私有化。 - Adrian Thompson Phillips
2个回答

2

DDD客户实体可能有Customer::changeName(Forename,Surname)...;

只有当客户实际更改其姓名时,才会触发changeName。接下来,您需要嵌入处理新名称所必需的所有业务逻辑。也许旧名称有待订单。也许您想将它们更新为新名称。也可能不是。有很多可能性。

至少对我来说,无血统领域对象和DDD实体之间的基本区别在于实体将实际执行比仅更新属性更多的操作。


你所描述的是一个丰富的领域模型。你是否表示实体等同于此?Eric Evans区分了这两者,这就是混淆的原因所在。 - Dr Schizo
说实话,我并不花太多时间去解析作者之间微妙的差异。目前为止,没有任何通常的DDD专家来给我投反对票,这是令人鼓舞的。还需要观察接下来会发生什么。 - Cerad
+1,在实体中的方法应该反映出现实生活中发生的事件,并表达在应用程序中的普适语言。顾客不会“将他们的街道设置为X和城市设置为Y”,而是“更改他们的送货信息”。@Dr Schizo Eric Evans如何区分Rich Domain Model和Entity?对我来说,实体只是丰富领域模型的一部分--RDM只是指领域层类作为一个整体(实体、值对象、服务)的一种方式。 - guillaume31
我认为处理未决订单应该作为订单领域的一部分,而不是客户。我建议在这里使用观察者模式,这样订单可以订阅以接收有关相关客户更改的通知。 - Adam Burley

1
我曾阅读过一个缺乏活力的领域模型通常用于表示数据库架构,但是实体也是这样吗?
也许你应该重新阅读Evans的书 ;) DDD实体是实现Rich Domain Model方法的一种方式。实体是丰富的,因为它捕获了应用程序的Ubiquitous Language中引用的领域动作。这些动作编码了业务领域中可能发生的现实事件,而不是数据插槽的原子、无身体修改。例如,您可以拥有一个Order.ApplyDiscountVoucher(...)方法来检查凭证有效性并重新计算订单总额,而不仅仅是公开一个Order.Total属性,并将其留给外部脚本来检查凭证和更新总额。
同时,实体还承担着强制执行不变量的责任,这些不变量可以在实体创建时应用,或者对于作为聚合根的实体,在每次有人试图更改聚合时应用。缺乏活力的模型没有内置这些业务规则,它们会在外部过程中处理。
无论实体、其他领域对象还是缺乏活力的对象是否可变都是完全独立的问题。

你刚才所突出的那一节来自Julie Lerner 的 PluralSight 视频《领域驱动设计基础》 :) - Dr Schizo
1
你的意思是,她问了这个问题,还是说她陈述了“对于实体来说都是一样”的观点?也许她在谈论 Entity Framework 的 Entities,它们与 DDD 的 Entities 非常不同。 - guillaume31
他们(Lerner和Smith)提到有时候贫血的领域模型经常被用来表示数据库架构。我知道她是EF的支持者,因此这可能是从哪里得来的,因此我感到困惑。我认为他们使用的图表显示了有界上下文以及实体部分所在的位置,这解释了很多事情。 - Dr Schizo
我的回答是针对你的“但实体也不是一样吗?”这部分,而不是她的“贫血领域模型通常用于表示数据库模式”这部分,我相信这是有效的 ;) - guillaume31

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接