天天看點

DDD 領域驅動設計

DDD 簡介

領域驅動設計(DDD) 是一種通過将實作連接配接到持續進化的模型來滿足複雜需求的軟體開發方法. 領域驅動設計的前提是:

  • 把項目的主要重點放在核心領域和領域邏輯上
  • 把複雜的設計放在領域模型上
  • 發起技術專家和領域專家之間的創造性協作,以疊代方式完善解決特定領域問題的概念模型

更多的介紹可以參考維基百科中的定義

分層

.NET中的ABP架構遵循DDD原則和模式去實作分層應用程式模型,該模型由四個基本層組成:

  • 表示層: 為使用者提供接口. 使用應用層實作與使用者互動.
  • 應用層: 表示層與領域層的中介,編排業務對象執行特定的應用程式任務. 使用應用程式邏輯實作用例.
  • 領域層: 包含業務對象以及業務規則. 是應用程式的核心.
  • 基礎設施層: 提供通用的技術功能,支援更高的層,主要使用第三方類庫.

這與Java的分層很相似,但是目前大家的開發中,基本上用的都是

Controller -> Service -> Dao

,

而DDD的思想不難看出,就是在我們現有的三層結構中添加了一個領域層。

  • 表示層{interfaces}
    • 接口服務位于使用者接口層,用于處理使用者發送的Restful請求和解析使用者輸入的配置檔案等,并将資訊傳遞給應用層。
  • 應用層{application}
    • 應用服務位于應用層。用來表述應用和使用者行為,負責服務的組合、編排和轉發,負責處理業務用例的執行順序以及結果的拼裝。
    • 應用層的服務包括應用服務和領域事件相關服務。
    • 應用服務可對微服務内的領域服務以及微服務外的應用服務進行組合和編排,或者對基礎層如檔案、緩存等資料直接操作形成應用服務,對外提供粗粒度的服務。
    • 領域事件服務包括兩類:領域事件的釋出和訂閱。通過事件總線和消息隊列實作異步資料傳輸,實作微服務之間的解耦。
  • 領域層{domain}
    • 領域服務位于領域層,為完成領域中跨實體或值對象的操作轉換而封裝的服務,領域服務以與實體和值對象相同的方式參與實施過程。
    • 領域服務對同一個實體的一個或多個方法進行組合和封裝,或對多個不同實體的操作進行組合或編排,對外暴露成領域服務。領域服務封裝了核心的業務邏輯。實體自身的行為在實體類内部實作,向上封裝成領域服務暴露。
    • 為隐藏領域層的業務邏輯實作,所有領域方法和服務等均須通過領域服務對外暴露。
    • 為實作微服務内聚合之間的解耦,原則上禁止跨聚合的領域服務調用和跨聚合的資料互相關聯。
  • 基礎層{infrastructrue}
    • 基礎服務位于基礎層。為各層提供資源服務(如資料庫、緩存等),實作各層的解耦,降低外部資源變化對業務邏輯的影響。
    • 基礎服務主要為倉儲服務,通過依賴反轉的方式為各層提供基礎資源服務,領域服務和應用服務調用倉儲服務接口,利用倉儲實作持久化資料對象或直接通路基礎資源。