DDD实体类

时间:2012-04-20 08:38:50

标签: c# domain-driven-design entity

我正试图在脑海中实施DDD方法。 到目前为止,我知道实体是唯一的,并通过其属性的组合来识别。

实体是抽象类,将由其他实体类实现。

到目前为止,我知道Version属性用于管理并发。 需要帮助本课程的其余部分。

我正在学习DDD,所以请描述您对此的看法或分享有用的具体主题链接。

public abstract class Entity<T>
    {
        #region Properties
        protected T _Id;
        private int _Version;
        #endregion

        private static bool IsTransient(Entity<T> obj)
        {
            return (obj != null) &&
                Equals(obj.Id, default(T));
        }

        private Type GetUnproxiedType()
        {
            return GetType();
        }

        public virtual T Id
        {
            get
            {
                return _Id;
            }
            protected set
            {
                _Id = value;
            }
        }

        public virtual int Version
        {
            get
            {
                return _Version;
            }
            set
            {
                _Version = value;
            }
        }

        public override bool Equals(object obj)
        {
            return Equals(obj as Entity<T>);
        }

        public virtual bool Equals(Entity<T> other)
        {
            if (other == null) return false;
            if (ReferenceEquals(this, other)) return true;
            if (!IsTransient(this) &&
                !IsTransient(other) &&
                Equals(Id, other.Id))
            {
                var otherType = other.GetUnproxiedType();
                var thisType = GetUnproxiedType();
                return (thisType.IsAssignableFrom(otherType)
                    || otherType.IsAssignableFrom(thisType));
            }
            return false;
        }

        public override int GetHashCode()
        {
            if (Equals(Id, default(T)))
            {
                return base.GetHashCode();
            }
            return Id.GetHashCode();
        }

        public static bool operator ==(Entity<T> e1, Entity<T> e2)
        {
            return Equals(e1, e2);
        }

        public static bool operator !=(Entity<T> e1, Entity<T> e2)
        {
            return !Equals(e1, e2);
        }

    }

更新

经过一番研究后,我结束了这个

当我们尝试比较两个对象时,使用Equals方法会派上用场。例如,在应用程序中的成像位置,其中我们在多个实例中具有相同的对象。一个来自数据库,一个来自客户端。我们需要找出该对象是否相同但不相同。

为此,我们将使用Equals方法。

1 个答案:

答案 0 :(得分:3)

实体不是由其属性的值唯一标识的;实体具有标识,但这并不意味着标识由其属性的值组成。 这意味着,如果您更改一个实体的属性,它的身份将会改变,并且您不希望这种行为。 (例如,如果您的地址发生变化,您的身份不会改变,您仍然是同一个人,住在另一个地址)。

(我看到你通过使用Id属性实现了身份/相等,这是一件好事。)

在实体旁边,您有值 - 对象。值对象的标识由其属性的值组成,因此,值对象最好是不可变的,因为更改值对象也意味着您更改其标识。

但是,你的问题是什么?