DDD - 实体应该有平等比较器

时间:2018-01-23 06:23:51

标签: domain-driven-design

埃文斯在plural sight视频中表示,#34;我已经开始相信一个实体甚至不应该进行平等比较"。

这是否意味着实体不需要具有必需的Id字段(因为它的基础设施问题)。在什么情况下需要实体比较?就像他在大多数情况下提到的那样,可能不需要它。

[编辑]当我提到不需要ID时,构建实体是w.r.t,即我可以用新对象(order = new Order)测试我的逻辑而不传递Guid或Id。理想情况下,db会生成持久性Id。

2 个答案:

答案 0 :(得分:1)

从理论上讲,实体不应该关心其ID;当实体查询或使用自己的ID时,我脑海中不会出现用例。

但是,它的ID被外界使用。几乎任何使用实体的客户端代码(演示,应用程序或基础架构)都将使用其ID。如果没有ID,客户端代码将无法在所有实体的集合中找到实体。

甚至Domain层代码也使用该ID。例如,在Aggregate中,Aggregate root在找到嵌套的Entity时使用ID,即使它只是一个简单的整数键。

更新: 在现实世界中,作为一个人类实体,当你吃,喝,睡觉或独自做任何事情时,你是否需要你的社会安全号码(或你拥有的任何身份证)?不,它与人体组织工作的业务规则在某种程度上无关。其他人类实体需要您将ID与其他人区分开来。

答案 1 :(得分:0)

Eric Evans所指的是平等运算符/方法的含义以及为什么要首先比较两个实体。如果你坚持尝试不在同一个事务中使用多个聚合,那么让两个对象代表同一个实体会变得更加奇怪。

使用相等的运算符/方法来检查技术/合成键,甚至是业务键,这可能是正常的,但你需要那个时?

如果您创建两个"空的",尚未键入的实体实例,然后具有相等的运算符/方法,那么您需要应用相当多的规则来确定它们是否是代表同一个实体。也许是社会保障/身份证号码?即便如此,这仍然是一件奇怪的事情。那些" business"在任何情况下,密钥可能都是数据存储中的约束值/列。

我认为没有提到mot有一些独特的标识,因为这是将一个实体与一个生命周期联系起来的东西。我不会放弃Id种类,不。