領域驅動(DDD)- 項目目錄劃分

DDD(領域驅動設計)項目的目錄結構應該反映其特性和規則,以下是一個常見的 DDD 項目的目錄結構:

- Application
  - Services
  - DTOs
- Domain
  - Models (或Entities)
  - Interfaces
  - Exceptions
  - ValueObjects
  - Events
- Infrastructure 
  - Repository
  - Persistence
  - DataAccess
- Presentation
  - Controllers
  - Views 
- Tests

一、Application 層

這是應用程序層,主要負責組織和協調領域層的業務對象來完成具體的業務任務。在這個層次的代碼通常會有一些任務調度,比如開啓事務,調用其它系統的服務,發送事件或消息等等。

  1. Services:服務目錄通常存放各種應用服務類。這些類的主要任務是對外部請求進行處理,協調並委託給領域層(Domain Layer)的類(如實體,領域服務等)進行實際的業務邏輯處理,並將結果回傳給調用者。需要注意的是,這裏的應用服務應儘量保持簡單,避免包含複雜的業務邏輯。

  2. DTOs(Data Transfer Objects):數據傳輸對象目錄是用來存放 DTO 類。DTO 是一種設計模式,其主要的使用場景是需要跨過程通信或需要進行性能優化的情況。它的核心思想是將多個數據打包在一個對象中進行傳輸。在 DDD 中,DTO 通常被用於在各層之間(如應用層與表示層、應用層與領域層等等)傳輸數據。

二、Domain 層

這是領域層,它包含了所有的業務規則和業務流程。在這個層次的代碼,你會看到領域模型(domain model),它由實體(entity),領域服務(domain service),值對象(value object),聚合(aggregate),領域事件(domain event)等組成。

在 DDD(領域驅動設計)中的 Domain 層通常包含以下幾部分:

  1. Models 或 Entities:這個目錄通常包含所有領域模型或實體類。領域模型或實體類通常具有唯一的標識符,並且封裝了相關的業務規則和行爲。

  2. Interfaces:這個目錄通常包含領域服務接口或倉儲接口等領域層接口定義。這些接口爲領域模型或業務提供可插拔、可擴展的支持。

  3. Exceptions:這個目錄通常包含領域模型中可能出現的異常。異常通常用於處理領域規則驗證失敗或業務邏輯錯誤等情況。

  4. ValueObjects:值對象是用來描述事物的某個方面而無需唯一標識。它們是一種組合多個值的方式。值對象不同於實體,值對象的相等性並不依賴於其身份(ID),而是依賴於它的屬性值。

  5. Events:領域事件是一種模型事件的方式,表明了某種重要的業務狀態發生了改變。這些事件可以用於觸發其他的業務邏輯,或者用於解耦業務組件。

類似層級表示

三、Infrastructure 層

這也被稱爲基礎設施層,這裏主要包含了系統的各種技術、框架和外部服務的實現。比如數據庫操作,消息隊列處理,文件系統操作,網絡通信等等。

  1. Repository:該部分的主要作用是提供一種像是使用集合操作的方式來操作對象,尤其是在領域驅動設計中的領域模型實體對象。其實現細節通常會涉及到如何與數據存儲技術(例如:關係型數據庫,NoSQL 數據庫等)進行交互。值得注意的是,Repository 不會直接進行數據庫查詢,而只是定義了訪問數據的程序接口。

  2. Persistence:該目錄主要對數據的持久化操作進行抽象封裝。包括數據的存儲、讀取、修改和刪除等操作。這裏可能會涉及到對象 - 關係映射 (ORM) 等技術,以提供與各種數據庫(例如 SQL,NoSQL 等)交互的能力。

  3. DataAccess:數據訪問層,是對數據庫操作的具體實現。在這個目錄下的類可以通過調用 Persistence 和 Repository 提供的接口與數據庫進行交互,包括創建、查詢、更新和刪除數據等操作。

四、Presentation 層

這是表示層,它的責任是與用戶或者其它系統進行交互。比如生成用戶界面,或者爲其它系統提供 RESTful API。

  1. Controllers:控制器負責處理用戶輸入的請求,然後調用應用層的服務來完成所需的操作,並將結果再返回給用戶。在一個典型的 MVC(模型 - 視圖 - 控制器)框架中,控制器就扮演這樣的角色。

  2. Views:視圖通常用於呈現數據給用戶。它會接收控制器傳遞的數據,然後按照制定的模版將數據呈現給用戶。在一個典型的 MVC(模型 - 視圖 - 控制器)框架中,視圖就起到這樣的作用。

五、Test 層

此爲測試層。對於 DDD 而言,測試至關重要。一切面向領域的業務邏輯,無論是在設計時還是開發中,都需要針對各種業務場景進行細節的完整測試。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/rFJ0JDRdEL-p4OQ933aeLw