2010-02-24 8 views
8

Je commence maintenant sur DDD, j'ai déjà trouvé une implémentation sympa pour ValueObject mais je n'arrive pas à trouver une bonne implémentation pour Entities, je veux un type d'entité de base générique qui aura un ID (requis par la spécification) et implémenter des opérations d'égalité de programme.Implémentation de la classe DDD Entity en C#

Quelle est la solution la plus élégante?

Répondre

18

La seule caractéristique d'une Entité est qu'elle a une longue vie et une identité (semi-) permanente. Vous pouvez encapsuler et exprimer cela en implémentant IEquatable<T>. Voici une façon de le faire:

public abstract class Entity<TId> : IEquatable<Entity<TId>> 
{ 
    private readonly TId id; 

    protected Entity(TId id) 
    { 
     if (object.Equals(id, default(TId))) 
     { 
      throw new ArgumentException("The ID cannot be the default value.", "id"); 
     } 

     this.id = id; 
    } 

    public TId Id 
    { 
     get { return this.id; } 
    } 

    public override bool Equals(object obj) 
    { 
     var entity = obj as Entity<TId>; 
     if (entity != null) 
     { 
      return this.Equals(entity); 
     } 
     return base.Equals(obj); 
    } 

    public override int GetHashCode() 
    { 
     return this.Id.GetHashCode(); 
    } 

    #region IEquatable<Entity> Members 

    public bool Equals(Entity<TId> other) 
    { 
     if (other == null) 
     { 
      return false; 
     } 
     return this.Id.Equals(other.Id); 
    } 

    #endregion 
} 
+0

Qu'entendez-vous par semi-permanent? – vorou

+0

+1. Est-ce une approche normale pour une grande application? Une question que j'ai posée aujourd'hui est d'attirer l'attention sur l'approche de la classe de base de l'Entité: https://softwareengineering.stackexchange.com/questions/364870/should-i-handle-all-nine-comparisons?noredirect=1#comment794683_364870. Cependant, cela fonctionne très bien pour nous. Il a même été décrit comme anémique dans l'un des commentaires. – w0051977

+0

@ w0051977 Je ne l'écrirais pas comme ça aujourd'hui. Il est vrai que la caractéristique d'une entité est que c'est la même entité si elle a le même ID, mais que l'implémentation de 'Equals' n'est pas utile dans les bases de code réelles. –

0

Je ne suis pas sûr si vous êtes après une bibliothèque spécifique/exemple de code ou de lignes directrices. Une bonne solution DDD utilisera l'usine pour l'instanciation, la persistance séparée du modèle de domaine (la plupart des ORM tendent à regrouper les deux), définissent clairement la frontière de domaine, appliquant les champs et les opérations via l'interface.

Je recommande fortement le livre Applying DDD and Patterns de Jimmy Nilson. Il discute en profondeur de DDD et des meilleures pratiques. Les exemples sont également en C#, ce qui convient à votre projet.