領域知識與模型 - 實體

此系列進一步討論「領域驅動設計」理論,作為商業級 ASP.NET MVC 樣式與架構實務一書的延伸學習教學,搭配圖書學習效果最佳 :)

實體(Entity)描述領域問題並且封裝資訊,是構成模型最重要的關鍵元素,我們透過建立類別的過程將實體具體化,完成領域模型的建立工作,因此瞭解實體的定義與設計原理就成為實作領域驅動設計最重要的一環。
實體組織領域模型中某部份特定區塊的關聯資訊,例如Product實體,表示一個特定的商品內容,為了識別這個商品,我們必須指派可識別的資訊給Product實體,因此在領域模型的設計中,我們建立具識別欄位的類別來表示實體,例如以下的Product 類別。
public class Product
{
    public int ProductID { get; set; }   // 識別ID
    public string ProductName { get; set; } // 商品名稱
    public decimal UnitPrice { get; set; }  // 單價
    public string Description { get; set; }  // 商品描述
}
其中宣告了四個不同的屬性儲存特定的商品資料,分別儲存對應的商品內容資料,而僅僅ProductID屬性被用來作為實體的識別,其它的屬性因為可能會有重複的資料,因此無法支援作為實體識別資訊。

ProductID必須是獨一無二的,而且一經產生就無法再變更,以維持永久的一致性,這是所有實體設計時均須遵守的關鍵規則,當實體物件資料被儲存至永久的儲存體 - 例如資料庫中,或是應用程式執行流程中取出儲存於記憶體時,都將以ProductID作為統一識別的辨識資訊。

有了識別ID,物件彼此之間就可以輕易的識別,並且透過識別ID進行辨識,擁有相同識別ID的實體,將會被識為相同,反之則是相異。

識別ID的設計,則是根據系統的需求而定,可以是簡單的流水號,數值類型的數字,或是組合字串,甚至結合物件的其它資訊即時建立的複合式識別編號等等。

要注意的是,現代商業應用均有專屬的儲存系統,一般通常是關聯式資料庫,如果實體直接對應至底層資料庫,可以利用資料庫中對應資料表的鍵值欄位,直接作為實體物件的識別ID,這種情形下比較方便,但是其它的關聯物件,則必須完成必須的關聯配置,這一部份在後續的教學中,進一步作討論。


沒有留言: