为什么要重视在DDD中实现IEquatable的对象?

时间:2017-06-09 15:10:25

标签: c# domain-driven-design equality value-objects

我是 DDD 的新手,我正在开展一个实施 DDD 概念的项目。

我知道在DDD中我们有实体值对象,我知道在值对象的情况下,如果我们需要确保它们的相等性,我们应该比较属性'每个值对象的值。

我们使用 C#作为编程语言,我想知道为什么我们需要覆盖 GetHashCode() Equals()方法?< / p>

我的意思是为什么我们不比较属性的值来比较值对象?

2 个答案:

答案 0 :(得分:6)

部分原因是因为你想以一种易于使用的方式设计你的课程。

例如,写/ Lattitude

要容易得多
coordinate1.Equals(coordinate2)

比你这样写

cooridate1.Latitude == coordinate2.Latitude && cooridnate2.Longitude == cooridnate2.Longitude

同样在更复杂的情况下,犯错也太容易了。例如,如果你写

price.Amount == price2.Amount

现在你忘了加入货币了。对于某些价值对象,你可能会有非显而易见的平等

public override bool Equals(Currency c) {
   //2 Kind of currency, dollars and cents.
   var amount = this.Amount;
   if (this.Currency != "Cents") amount = amount * 100;
   var amount2 = c.Amount;
   if (c.Currency != "Cents") amount2 = amount2 * 100;

   return amount == amount2;
} 

GetHashcode被HashSet和其他期望Equatable对象的算法使用。

每日提示: 还为您的值对象提供==和!=方法。默认情况下,它们将检查引用相等性,并且在值对象的情况下,这不是您的情况。而这只是你不想发生的一个错误来源。

答案 1 :(得分:0)

价值对象没有身份。它们由那些属性定义。他们的属性决定他们的身份所以我们根据它们的属性进行比较。

这就是为什么在比较值对象时,需要覆盖EqualsGetHashCode方法。