我想在我的新项目中应用/练习DDD,因此我正在创建那些典型的DDD基类,即Entity
,ValueObject
,AggregateRoot
等等。
问题:
当您具有实体基础对象实现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);
}
}
答案 0 :(得分:0)
如果您想关注此书,请记住:
一个未由其属性定义的对象,而是由一个 连续性及其身份的线索。
现在,在此上下文中,identity表示“区别于其他对象的对象的属性”,在大多数情况下,这意味着实体主键(如果您的实体持久存储在数据库中)或某种Id属性,在大多数情况下,GUID会起作用。
所以回答你的问题: