2010-02-24 2 views
8

Ich beginne jetzt auf DDD, ich habe bereits eine nette Implementierung für ValueObject gefunden, aber ich kann nicht scheinen, eine gute Implementierung für Entitäten zu finden, ich möchte eine generische Basis Entität Typ, die haben eine ID (die von der Spezifikation benötigt wird) und korrekte Gleichheitsoperationen implementieren.Implementieren DDD Entity-Klasse in C#

Was ist die eleganteste Lösung?

Antwort

18

Das einzige Merkmal einer Entität ist, dass sie eine langlebige und (semi-) permanente Identität hat. Sie können dies durch Implementierung von IEquatable<T> kapseln und ausdrücken. Hier ist eine Möglichkeit, es zu tun:

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

was meinst du mit semipermanent? – vorou

+0

+1. Ist das ein normaler Ansatz für eine große App? Eine Frage, die ich heute gestellt habe, zieht Kritik am Ansatz der Entity-Basisklasse auf sich: https://softwareengineering.stackexchange.com/questions/364870/should-i-handle-all-nine-comparisons?noredirect=1#comment794683_364870. Aber es funktioniert sehr gut für uns. Es wurde sogar in einem der Kommentare als anämisch beschrieben. – w0051977

+0

@ w0051977 Ich würde es heute nicht so schreiben. Es ist wahr, dass die Eigenschaft einer Entity ist, dass es dieselbe Entity ist, wenn sie dieselbe ID hat, aber dass die Implementierung von Equals in den tatsächlichen Codebasen nicht hilfreich ist. –

0

Ich bin mir nicht sicher, ob Sie nach einer bestimmten Bibliothek/Beispielcode oder Richtlinien sind. Eine gute DDD-Lösung verwendet Factory für Instanziierung, Persistenz getrennt vom Domänenmodell (die meisten ORM neigt dazu, die beiden zusammen zu bündeln), klar definieren Domänengrenze, Durchsetzung von Feldern und Operationen über Schnittstelle.

Ich würde das Buch Anwenden DDD und Muster Buch von Jimmy Nilson stark empfehlen. Es wird ausführlich über DDD und Best Practices diskutiert. Die Beispiele sind auch in C#, was zu Ihrem Projekt passt.