【问题标题】:The difference between anemic domain model and an entity贫血领域模型和实体之间的区别
【发布时间】:2014-09-09 15:41:35
【问题描述】:

我正在努力深入了解 DDD,并阅读了 Eric Evans 关于领域驱动设计的书和 Julie Lerman 的博客,他们描述了:

Anemic Domain Model 作为具有专注于状态管理的类的模型。适合 CRUD。

Entity 作为一个可变类,具有用于跟踪和持久性的标识。

肯定两者都用于同一目的,还是我完全搞错了?两者有什么区别?我读过一个贫血的领域模型经常被用来表示一个数据库模式,但对于一个实体来说也不一样吗?

例如,一个名为 Customer 的 table 具有:

CustomerId int
Forename varchar(50)
Surname varchar(50)
IsActive bit

根据我的理解,anemic domain model 代表这看起来像:

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

对我来说,过去的经验表明,一个实体也可以通过一系列gettersetter 属性以这种方式表示,这是一个实体框架吗?两个概念(实体和贫血域模型)都是mutable?

谢谢,DS。

【问题讨论】:

  • 我想说他们来自两个不同的世界。最好比较贫血模型与富域模型数据传输对象与实体/值对象/聚合根.
  • 这里的问题再次是我们如何处理 DTO / 实体和值对象,因为值对象是不可变的,而实体和 DTO 不是。改变状态是可以接受的。
  • 贫血域模型和 DTO 没有行为。丰富的域模型和实体/值对象/聚合根有它。没错,实体、值对象和聚合根是不同的,但它们通常都有行为。
  • 如果您在域中使用 EF 实体,您将永远无法获得所需的域实体,这几乎是不可能的。例如,我对您的 Customer 类所做的第一个修改是使 CustomerId 只读,甚至完全私有。

标签: entity domain-driven-design anemic-domain-model


【解决方案1】:

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

changeName 只有在客户实际更改姓名时才会触发。然后,您将嵌入处理新名称所需的任何业务逻辑。也许有旧名称的挂单。也许您想将它们更新为新名称。也许不吧。很多可能性。

至少对我而言,贫血领域对象和 DDD 实体之间的基本区别在于,实体实际上要做的不仅仅是更新属性。

【讨论】:

  • 您所描述的是一个丰富的域模型。你是说一个实体相当于这个吗?埃里克·埃文斯(Eric Evans)将两者区分开来,这就是产生混淆的地方。
  • 老实说,我不会花太多时间来分析作者之间的细微差别。通常的 DDD 专家都没有来过我,但还没有投票给我,这令人鼓舞。必须看看会发生什么。
  • +1,实体中的方法应该反映现实生活中发生的事件,并用应用程序的通用语言表达。客户不会“将他们的街道设置为 X,将城市设置为 Y”,而是“更改他们的送货信息”。 @Dr Schizo Eric Evans 如何区分富域模型和实体?对我来说,实体只是丰富领域模型的一个子部分——RDM 只是将领域层类作为一个整体(实体、值对象、服务)引用的一种方式。
【解决方案2】:

[ 我读过一个贫血的领域模型经常被用来表示一个 数据库架构,],但对于实体也不相同?

也许您应该重新阅读 Evans 的书;) DDD 实体是实现富域模型方法的一种方式。实体的丰富之处在于它捕获应用程序的通用语言中引用的域操作。这些动作对可能发生在业务领域的真实事件进行编码,而不是对数据槽进行原子的、无实体的修改。例如,您可以有一个 Order.ApplyDiscountVoucher(...) 方法来检查凭证有效性并重新计算订单总数,而不是仅仅公开 Order.Total 属性并将其留给外部脚本来检查凭证并更新总数。

同样封装在实体中的是强制执行不变量的责任,这可以在实体创建时应用,或者对于作为聚合根的实体,每次有人尝试更改聚合时应用。贫血模型不会内置这些业务规则,它们将在外部程序中处理。

实体、其他领域对象或贫血对象是否应该是可变的与此完全正交。

【讨论】:

  • 您在上面突出显示的部分来自 Julie Lerner 的 PluralSight 视频领域驱动设计基础 :)
  • 你的意思是,她问了这个问题,还是她说“对于一个实体来说也是一样的”?也许她说的是Entity Framework的Entities,它与DDD的Entities有很大的不同。
  • 好吧,他们(Lerner 和 Smith)提到有时贫血的域模型经常被用来表示数据库模式。我知道她是 EF 的倡导者,因此这可能来自哪里,因此我感到困惑。我认为他们使用的图表显示了有界上下文以及实体部分所在的位置,这解释了很多事情。
  • 嗯,我的回答是对你的“但是对于一个实体来说也不一样吗?” 部分而不是她的“贫血域模型通常用于表示一个数据库模式” 部分,我相信它是有效的;)
猜你喜欢
  • 1970-01-01
  • 2010-12-26
  • 2012-02-04
  • 2010-12-20
  • 2014-04-19
  • 2014-01-05
  • 2020-01-29
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多