为什么在 DDD 中实现 IEquatable 的值对象?

Why value objects implementing IEquatable in DDD?

我是 DDD 的新手,我正在从事一个他们实施 DDD 概念的项目。

我知道在 DDD 中我们有 EntitiesValue objects,而且我知道在值对象的情况下是否需要确保它们的相等性我们应该比较每个值对象的属性值。

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

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

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

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

部分是因为您想以易于使用的方式设计 类。

例如write/Lattitude

就容易多了
coordinate1.Equals(coordinate2)

不如这样写

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

此外,在更复杂的情况下,也很容易出错。例如,如果你写

price.Amount == price2.Amount

现在您忘了包括货币。对于某些值对象,您可能 evan 具有不明显的等式

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 对象的算法使用。

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