在這種情況下,我只能依靠標識在Equals
和GetHashcode
方法,如果ID已被分配。 在其他情況下,我比較使用參考的平等。 GetHashCode
實現也是如此;我只創建一個基於'Id'的哈希碼,如果Id已被分配。 (也就是說,如果實體不是瞬態的)。
下面的代碼是我使用的。這有點基於夏普架構中的實體:
public override bool Equals(object obj)
{
Entity<TId> other = obj as Entity<TId>;
if(other == null || this.GetType() != other.GetType())
{
return false;
}
bool otherIsTransient = Equals (other.Id, default(TId));
bool thisIsTransient = Equals (this.Id, default (TId));
if(otherIsTransient && thisIsTransient)
{
return ReferenceEquals (this, other);
}
return Id.Equals (other.Id);
}
首先,我檢查兩個實體是否屬於同一類型。 (實際上,你也可以通過實現正確的接口來創建這種方法的打字版本(IEquality<T>
) 當兩個實體屬於同一類型時,我檢查它們中的一個是否是瞬態的,我只是通過檢查它們的ID屬性:如果它包含默認值,表示它們還沒有被保存在數據庫中 如果它們都是瞬態的,我將它們的引用進行比較,否則我可以在它們的ID上比較它們。
GetHashCode方法,我使用,可確保多數民衆贊成返回的值,永遠不會改變:
private int? _oldHashCode;
public override int GetHashCode()
{
// Once we have a hash code we'll never change it
if(_oldHashCode.HasValue)
{
return _oldHashCode.Value;
}
bool thisIsTransient = Equals (Id, default(TId));
// When this instance is transient, we use the base GetHashCode()
// and remember it, so an instance can NEVER change its hash code.
if(thisIsTransient)
{
_oldHashCode = base.GetHashCode();
return _oldHashCode.Value;
}
return Id.GetHashCode();
}
,爲什麼你想'在首位實體Equals'方法 – driushkin
謝謝你的評論。有很多情況我需要比較它們,特別是在客戶端/服務器數據同步的情況下。我將舊的非DDD代碼移植到域驅動的體系結構中,因此我可以估計我需要身份比較。 – mbue
實體的整體思想是它有自己的身份,即它與所有其他實體不同。不要讓克隆人統治世界! – driushkin