2

我正在尝试在脑海中实施 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 方法。

4

1 回答 1

3

实体不是由其属性值唯一标识的;一个实体有一个身份,但这并不意味着该身份是由其属性的值组成的。这意味着,如果你改变一个实体的属性,它的身份就会改变,你不想要这种行为。(例如,如果您的地址改变了,您的身份没有改变,您仍然是同一个人,住在另一个地址)。

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

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

但是,你的问题是什么?

于 2012-04-20T08:43:24.643 回答