2010-02-24 77 views
8

我現在開始使用DDD,我已經發現了一個很好的ValueObject實現,但我似乎找不到任何實體的好實現,我想要一個通用的基類實體類型一個ID(規格所需)和實現正確的相等操作。在C#中實現DDD實體類

什麼是最優雅的解決方案?

回答

18

實體的唯一特徵是它具有長壽命和(半)永久的身份。你可以通過執行IEquatable<T>來封裝和表達。下面是做這件事:

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

你是什麼意思半永久? – vorou 2013-02-24 17:57:36

+0

+1。這是一個大型應用程序的正常方法?我今天提出的一個問題正在吸引批評實體基類方法:https://softwareengineering.stackexchange.com/questions/364870/should-i-handle-all-nine-comparisons?noredirect = 1#comment 794683_364870。但是,它對我們來說效果很好。其中一條評論甚至被描述爲貧血。 – w0051977 2018-01-29 18:07:28

+0

@ w0051977今天我不會那樣寫。確實,實體的特點是,如果它具有相同的ID,它就是相同的實體,但是'Equals'的實現在實際的代碼庫中沒有幫助。 – 2018-01-29 21:49:01

0

我不確定您是否在遵循特定的庫/示例代碼或指導原則。 一個好的DDD解決方案將使用工廠實例化,持久性與領域模型分離(大多數ORM傾向於將兩者捆綁在一起),明確定義領域邊界,通過接口強制領域和操作。

我強烈推薦Jimmy Nilson的書「應用DDD和模式」一書。它深入討論了DDD和最佳實踐。這些例子也在C#中,這將適合您的項目。