初識Clean Architecture

軟體架構

 

假日把Clean Architecture的觀念嗑完,於是開始著手套用在Side Project上,在這邊稍微筆記一下,依據各層次來放置程式

1. Entities(實體)

實體層包含企業的核心邏輯和業務規則。這些實體是獨立於應用程式的具體技術細節的,並且應該能夠在不同的應用程式或環境中使用。

特點:

  • 包含業務邏輯和規則。
  • 獨立於其他層次,應用程式的具體實作方式不影響這層。
  • 由純粹的 POCO (Plain Old CLR Object) 構成。

2. Use Cases(使用案例)

使用案例層包含應用程式特定的業務規則。

它定義應用程式應該如何與實體交互實作具體的業務功能。

這一層專注於應用程式的行為,與框架、資料庫….等技術實做無關。

特點:

  • 定義應用程式的業務邏輯和流程。
  • 驅動實體與其他系統層之間的交互。
  • 通過介面與外部世界交互,保持與技術細節的解除耦合性。

3. Interface Adapters(介面轉接層)

介面轉接層負責將資料從用戶畫面或外部系統轉換為應用程式可以理解的格式,並將應用程式的資料轉換為外部系統需要的格式。

這一層包括控制器、檢視模型、Repository介面等。

特點:

  1. 將輸入(例如 HTTP 請求)轉換為應用程式的輸入格式。
  2. 將應用程式的輸出轉換為外部系統的輸出格式(例如 HTTP 回應)。
  3. 包含倉儲模式介面,用於持久化和請求。

4. Frameworks & Drivers(框架和驅動層)

框架和驅動層包括所有具體的工具和框架,如資料庫、Web 框架、外部 API 等。這一層通常包含基礎設施程式,並依賴於介面轉接層來與應用程式進行交互。

特點:

  1. 包含具體的技術實作和工具。
  2. 應用程式提供必要的技術支援,如資料庫連接、HTTP 處理等。
  3. 依賴於介面轉接層進行應用程式的操作,實作技術細節的封裝。

依據這樣架構如下:

TaskApp
├── TaskApp.Application
|   |── UseCase
|───|──Task
│   ├──── Commands
│   │      └── CreateTask
│   │            ├── CreateTaskCommand.cs
│   │            └── CreateTaskCommandHandler.cs
│   ├────Queries
│   │      └── GetAllTasks
│   │            ├── GetAllTasksQuery.cs
│   │            └── GetAllTasksQueryHandler.cs
│   └── Interfaces
│       └── ITaskRepository.cs
├── TaskApp.Domain
│   └── Entities
│       └── Task.cs
├── TaskApp.Infrastructure
│   └── Persistence
│       └── TaskRepository.cs
├── TaskApp.WebAPI
│   ├── Controllers
│   │   └── TaskController.cs
│   └── Program.cs
└── TaskApp.sln

依據上述說明,來分別解釋底下

TaskApp.Application

  • Commands: 包含指令操作和它們的處理程序。
    • CreateTaskCommand.cs: 定義建立任務的命令。
    • CreateTaskCommandHandler.cs: 處理建立任務的命令的邏輯。
  • Queries: 包含查詢操作和它們的處理程序。
    • GetAllTasksQuery.cs: 定義查詢所有任務的請求。
    • GetAllTasksQueryHandler.cs: 處理查詢所有任務請求的邏輯。
  • Interfaces: 定義應用程序層需要的接口。
    • ITaskRepository.cs: 定義任務倉儲的介面。

TaskApp.Domain

  • Entities: 包含業務實體和規則。
    • Task.cs: 定義任務實體。

TaskApp.Infrastructure

  • Persistence: 包含資料存取和持久化的實作。
    • TaskRepository.cs: 任務倉儲模式的具體實作。

TaskApp.WebAPI

  • Controllers: 包含 API 控制器。
    • TaskController.cs: 定義任務相關的 API 。
  • Program.cs: 配置和啟動應用程式。

清晰的層次劃分

  1. Domain 層: 只包含業務實體 (Task.cs),獨立於其他技術細節。
  2. Application 層: 定義應用程式的業務邏輯,包括指令、查詢和介面。
  3. Infrastructure 層: 提供具體的技術實作,如資料存取 (TaskRepository.cs)。
  4. WebAPI 層: 包含 API 控制器和應用程式的配置啟動 (Program.cs)。

總結

筆者在實務上開發覺得他比階層架構還好維護,因為可以找到對應的使用案例和套用CQRS模式,找到對應的程式碼,符合SRP的原則。

 

元哥的筆記