2017-05-26 3 views
0

Je veux appliquer/pratiquer DDD avec mon nouveau projet donc je crée ces classes de base DDD typiques, c'est-à-dire, Entity, ValueObject, AggregateRoot et ainsi de suite.Entité DDD - sont deux entités avec l'identité par défaut considérée comme égale

Question: Lorsque vous avez l'objet de base Entité IEquatable mettre en œuvre, si deux entités ayant une valeur par défaut de l'identité (Id) être considérés comme Différent ou égale?

Par exemple, j'utilise Guid type pour l'identité

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

Juste une question non liée à votre question: est-ce une chose C# pour définir cette clases de base? En 'PHP', j'aime éviter l'héritage, en particulier dans les objets de domaine (entités, racines agrégées, objets de valeur). –

+0

@Constantin: non, ce n'est pas une chose C# :) --- c'est un choix de design fait par certaines personnes. Je ne les utilise pas moi-même et je ne le recommanderais pas non plus. Ne fait pas mal, mais n'ajoute pas vraiment beaucoup de valeur à mon humble avis. –

+0

@David, pour répondre à votre question: techniquement les "objets" sont les mêmes mais d'un point de vue métier avoir une entité/agrégat sans clé n'a pas grand sens et l'égalité, ou son absence, n'a pas de sens. –

Répondre

0

Si vous voulez suivre le livre sur ce alors souvenez-vous que:

Un objet non défini par ses attributs, mais plutôt par un fil de continuité et son identité.

Maintenant, dans cette identité contexte signifie « la propriété des objets qui les distingue des autres objets », qui, dans la plupart des cas signifie que la clé primaire de l'entité (si vos entités sont conservées dans une base de données) ou une sorte d'attribut Id, dans la plupart des cas, un GUID fera l'affaire.

Pour répondre à votre question:

  1. Oui, ils sont la même entité.
  2. Faites attention à la façon dont vous créez votre
  3. de Id
+0

Puis-je supprimer le constructeur vide Entity() pour que je puisse forcer les sous classes à lui passer un Id? –

+0

Je le ferais, mais c'est juste une question de style. – yorodm