我想申請/練習DDD與我的新項目,因此我創建了那些典型的DDD基類,即Entity
,ValueObject
,AggregateRoot
等等。DDD實體 - 兩個實體的默認身份認爲是相等的
問: 當你有實體基本對象實施IEquatable
,應與標識(ID)的默認值,兩個實體被視爲不等於或等於?
例如,我用Guid
類型的身份
public interface IEntity
{
Guid LocalId { get; }
}
public abstract class Entity : IEntity, IEquatable<Entity>
{
public Guid LocalId { get; private set; }
protected Entity()
{
this.LocalId = Guid.Empty;
}
protected Entity(Guid id)
{
if (Guid.Empty == id)
{
id = Guid.NewGuid();
}
this.LocalId = id;
}
public bool Equals(Entity other)
{
if (ReferenceEquals(other, null))
{
return false;
}
if (ReferenceEquals(other, this))
{
return true;
}
// **Question** - should I return false or true here?
if (other.LocalId == Guid.Empty && this.LocalId == Guid.Empty)
{
return false;
}
return (other.LocalId == this.LocalId);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(obj, null))
{
return false;
}
if (ReferenceEquals(obj, this))
{
return true;
}
if (!obj.GetType().Equals(typeof(Entity)))
{
return false;
}
return Equals((Entity)obj);
}
public override int GetHashCode()
{
return this.LocalId.GetHashCode();
}
public static bool operator==(Entity left, Entity right)
{
return Equals(left, right);
}
public static bool operator!=(Entity left, Entity right)
{
return !Equals(left, right);
}
}
只是一個問題不相關的問題:它是一個C#的事來定義這個基地clases?在'PHP'中,我喜歡避免繼承,特別是在域對象(實體,聚合根,值對象)中。 –
@Constantin:不,它不是C#的東西:) ---這是一些人設計的選擇。我不使用這些,也不會推薦它。沒有傷害,但也沒有真正增加多少價值恕我直言。 –
@David,回答你的問題:從技術上講,「對象」是相同的,但從業務角度來看,擁有沒有密鑰的實體/集合體是沒有意義的,平等或缺乏平等沒有意義。 –