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);
        }

    }

更新しました

いくつかの調査の後、私はこれで結論付けました

2 つのオブジェクトを比較しようとする場合、Equals メソッドを使用すると便利です。たとえば、複数のインスタンスに同じオブジェクトがあるアプリケーションの場所をイメージングします。1 つはデータベースから、もう 1 つはクライアントからです。そのオブジェクトが同一でありながら同じではないかどうかを調べる必要があります。

これには、Equals メソッドを使用します。

4

1 に答える 1

3

エンティティは、その属性の値によって一意に識別されるわけではありません。エンティティには ID がありますが、それは ID がその属性の値によって構成されているという意味ではありません。つまり、エンティティの属性を変更すると、そのアイデンティティが変更され、その動作が望ましくないことを意味します。(たとえば、住所が変わっても身元は変わらず、同じ人で、別の住所に住んでいます)。

(Id プロパティを使用して同一性/等価性を実装したようですが、これは良いことです)。

エンティティの次に、値、つまりオブジェクトがあります。値オブジェクトの ID は、その属性の値によって構成されます。したがって、値オブジェクトを変更すると、その ID も変更されることになるため、値オブジェクトは不変であることが望ましいです。

しかし、あなたの質問は何ですか?

于 2012-04-20T08:43:24.643 に答える