我現在開始使用DDD,我已經發現了一個很好的ValueObject實現,但我似乎找不到任何實體的好實現,我想要一個通用的基類實體類型一個ID(規格所需)和實現正確的相等操作。在C#中實現DDD實體類
什麼是最優雅的解決方案?
我現在開始使用DDD,我已經發現了一個很好的ValueObject實現,但我似乎找不到任何實體的好實現,我想要一個通用的基類實體類型一個ID(規格所需)和實現正確的相等操作。在C#中實現DDD實體類
什麼是最優雅的解決方案?
實體的唯一特徵是它具有長壽命和(半)永久的身份。你可以通過執行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
}
爲了實現正確的平等操作,我建議有在Sharparchitecture基類域實體的樣子 - https://github.com/sharparchitecture/Sharp-Architecture/blob/master/Solutions/SharpArch.Domain/DomainModel/EntityWithTypedId.cs。它具有所有必需功能的實現。並看看其他一些代碼,國際海事組織,這將是非常有用的你和你的情況。
我不確定您是否在遵循特定的庫/示例代碼或指導原則。 一個好的DDD解決方案將使用工廠實例化,持久性與領域模型分離(大多數ORM傾向於將兩者捆綁在一起),明確定義領域邊界,通過接口強制領域和操作。
我強烈推薦Jimmy Nilson的書「應用DDD和模式」一書。它深入討論了DDD和最佳實踐。這些例子也在C#中,這將適合您的項目。
你是什麼意思半永久? – vorou 2013-02-24 17:57:36
+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
@ w0051977今天我不會那樣寫。確實,實體的特點是,如果它具有相同的ID,它就是相同的實體,但是'Equals'的實現在實際的代碼庫中沒有幫助。 – 2018-01-29 21:49:01