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

Wad*_*eed 2 c# domain-driven-design equality value-objects

我是DDD的新手,我正在开发一个实现DDD概念的项目.

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

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

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

Bat*_*via 6

部分原因是因为您希望以易于使用的方式设计类.

例如,写/ Lattitude要容易得多

coordinate1.Equals(coordinate2)
Run Code Online (Sandbox Code Playgroud)

比如你这样写

cooridate1.Latitude == coordinate2.Latitude && cooridnate2.Longitude == cooridnate2.Longitude
Run Code Online (Sandbox Code Playgroud)

另外在更复杂的情况下,犯错也太容易了.例如,如果你写

price.Amount == price2.Amount
Run Code Online (Sandbox Code Playgroud)

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

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;
} 
Run Code Online (Sandbox Code Playgroud)

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

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