我是 DDD 的新手,我正在开展一个实施 DDD 概念的项目。
我知道在DDD中我们有实体和值对象,我知道在值对象的情况下,如果我们需要确保它们的相等性,我们应该比较属性'每个值对象的值。
我们使用 C#作为编程语言,我想知道为什么我们需要覆盖 GetHashCode()和 Equals()方法?< / p>
我的意思是为什么我们不比较属性的值来比较值对象?
答案 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)
价值对象没有身份。它们由那些属性定义。他们的属性决定他们的身份所以我们根据它们的属性进行比较。
这就是为什么在比较值对象时,需要覆盖Equals
和GetHashCode
方法。