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

时间:2014-09-09 15:41:35

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

我正在努力深入了解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。

2 个答案:

答案 0 :(得分:2)

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

只有在客户实际更改其名称时才会触发

changeName。然后,您将嵌入处理新名称所需的任何业务逻辑。也许有旧名称的挂单。也许您想将它们更新为新名称。也许不吧。很多可能性。

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

答案 1 :(得分:1)

  

[我读过一个贫血的领域模型经常被用来代表一个   数据库模式,]但实体也不一样吗?

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

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

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