3

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

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

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

当然两者都用于相同的目的,或者我完全搞错了?两者有什么区别?我读过贫血的域模型通常用于表示数据库模式,但对于实体来说也不一样吗?

例如,一个table被调用的 Customer 具有:

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。

4

2 回答 2

2

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

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

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

于 2014-09-09T16:32:22.023 回答
1

[我读过贫血的域模型通常用于表示数据库模式,] 但是对于实体来说也不一样吗?

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

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

实体、其他领域对象或贫血对象是否应该是可变的,这是一个完全正交的问题。

于 2014-09-10T10:33:51.523 回答