DDD实体 - 两个实体,默认标识被认为是相等的

时间:2017-05-26 17:40:09

标签: c# entity domain-driven-design aggregateroot iequatable

我想在我的新项目中应用/练习DDD,因此我正在创建那些典型的DDD基类,即EntityValueObjectAggregateRoot等等。

问题: 当您具有实体基础对象实现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);
    }
}

1 个答案:

答案 0 :(得分:0)

如果您想关注此书,请记住:

  

一个未由其属性定义的对象,而是由一个   连续性及其身份的线索。

现在,在此上下文中,identity表示“区别于其他对象的对象的属性”,在大多数情况下,这意味着实体主键(如果您的实体持久存储在数据库中)或某种Id属性,在大多数情况下,GUID会起作用。

所以回答你的问题:

  1. 是的,他们是同一个实体。
  2. 小心你如何创造你的 的id