首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

EntityFramework 領域驅動設計實踐(五):聚合模式——邊界、根與生命週期統一

     編輯:關於.NET

聚合:表達完整領域概念的對象叢集

聚合將實體與值對象組合,共同表達一個完整業務概念。如「車」包含四個「輪子」,輪子離開車無意義,「車」為聚合根。

案例模型中的三個聚合

案例聚合劃分

  • 客戶-信用卡:客戶為根,信用卡為內部實體。
  • 訂單-訂單行:訂單為根,訂單行離開訂單無意義。
  • 產品分類-產品:視業務而定。若分類僅為產品屬性,屬值對象;若需維護分類促銷,則分類與產品各自為聚合根。

聚合根原則

  • 外部僅能通過根訪問內部對象。
  • 創建、持久化、刪除以根為單位,整個聚合同生共死。
  • 若代碼需直接操作內部實體 CRUD,說明聚合劃分有誤。

EF 不支援聚合概念的應對

EF 將所有實體平鋪在 ObjectContext 中。解決方案:定義 IAggregateRoot 標記介面,配合 partial class 讓根實體實現該介面:

public interface IAggregateRoot { }
[AggregateRoot("Orders")]
partial class Order : IAggregateRoot {
    public decimal TotalDiscount => Lines.Sum(l => l.Discount);
    public decimal TotalAmount => Lines.Sum(l => l.LineAmount);
}

介面用作泛型約束(如倉儲 where T : IAggregateRoot),技術上標識聚合根身份。

進階:IEntity 基礎介面

interface IEntity { Guid Id { get; set; } }
interface IAggregateRoot : IEntity { }

明確「聚合根是實體」的語義。

總結

領域模型需依業務概念劃分聚合,每聚合一根,生命週期操作作用於根。EF 雖無原生支援,但可用介面與 partial class 補足。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved