Wad*_*eed 2 c# domain-driven-design equality value-objects
我是DDD的新手,我正在开发一个实现DDD概念的项目.
我知道在DDD中我们有Entities和Value对象,我知道在值对象的情况下,如果我们需要确保它们的相等性,我们应该比较每个值对象的属性值.
我们使用C#作为编程语言,我想知道为什么我们需要重写GetHashCode()和Equals()方法?
我的意思是为什么我们不比较属性的值来比较值对象?
部分原因是因为您希望以易于使用的方式设计类.
例如,写/ 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对象的算法所使用.
当天的提示:还为您的价值对象提供==和!=方法.默认情况下,它们将检查引用相等性,并且在值对象的情况下,这不是您的情况.它只是你不想发生的一个错误来源.