專案結構
Go 專案架構模式:扁平化結構與 DDD。
扁平化專案結構(Lightweight DDD / CRUD-heavy)
project-root/
├── cmd/
│ └── api/
│ └── main.go # 程式啟動點:初始化 DB、Router、DI 注入
├── internal/
│ ├── config/
│ │ └── config.go # 環境變數 / 配置讀取
│ ├── order/ # 資源模組
│ │ ├── model.go # Entity / Value Object(純資料結構)
│ │ ├── repository.go # Repository interface + 簡單 DB 實作
│ │ ├── service.go # 業務邏輯 / Use Case
│ │ └── handler.go # HTTP Handler / Router
│ ├── user/ # 另一個資源模組,結構相同
│ │ ├── model.go
│ │ ├── repository.go
│ │ ├── service.go
│ │ └── handler.go
│ └── util/ # 工具函式 / helper
│ └── logger.go
├── scripts/ # migration、seed 或其他工具腳本
├── test/ # 整合測試 / fixtures
└── go.mod扁平化結構說明
| 檔案 | 責任 |
|---|---|
| model.go | Entity / Value Object,純資料物件,不包含 DB 或 HTTP 邏輯 |
| repository.go | Repository interface + 簡單實作(DB CRUD),service 呼叫它 |
| service.go | 業務邏輯 / Use Case,流程 orchestration、呼叫 repository |
| handler.go | HTTP / gRPC Handler,解析 request → 呼叫 service → 回傳 response |
| util/logger.go | 共用工具函式,例如日誌、helper、驗證函式 |
呼叫流程:
HTTP Request → handler.go → service.go → repository.go → DBDDD(Domain-Driven Design)
project-root/
├── cmd/
│ └── api/
│ └── main.go # 啟動程式,組裝依賴、啟動 HTTP Server
├── internal/
│ ├── domain/ # 核心商業邏輯,完全不依賴框架
│ │ └── order/
│ │ ├── aggregate/ # Aggregate Root,承載核心行為
│ │ │ └── order.go
│ │ ├── entity/ # 輔助 Entity
│ │ │ └── line_item.go
│ │ ├── valueobject/ # Value Object,不可變物件
│ │ │ ├── order_id.go
│ │ │ └── money.go
│ │ ├── repository/ # Repository Interface(Domain 介面)
│ │ │ └── order_repository.go
│ │ ├── service/ # Domain Service(跨 Aggregate / 複雜規則)
│ │ │ └── order_domain_service.go
│ │ ├── event/ # Domain Event
│ │ │ └── order_created.go
│ │ └── factory/ # Aggregate Factory
│ │ └── order_factory.go
│ ├── application/ # 系統 Use Case(入口)
│ │ └── order/
│ │ ├── command/ # 改變系統狀態
│ │ │ └── create_order.go
│ │ ├── query/ # 讀取資料
│ │ │ └── get_order.go
│ │ └── dto/ # Data Transfer Object
│ │ └── order_dto.go
│ ├── infrastructure/ # 技術細節實作
│ │ └── order/
│ │ ├── persistence/ # Repository 實作(MySQL, Postgres…)
│ │ │ └── mysql_order_repository.go
│ │ └── messaging/ # Kafka / RabbitMQ Publisher
│ │ └── kafka_publisher.go
│ └── interfaces/ # 外部介面 / API 層
│ └── http/
│ └── order/
│ └── handler.go # HTTP handler,只調用 application
└── app/
└── bootstrap.go # 專案組裝點,DI / wiring正式 DDD 說明
| 層級 | 責任 |
|---|---|
| domain | 核心商業邏輯,包含 Aggregate / Entity / ValueObject / Domain Service / Repository Interface / Event / Factory |
| application | 系統 Use Case,決定流程、transaction boundary,回傳 DTO 給外部 |
| infrastructure | 技術實作細節,實作 Repository / Event Publisher / Messaging |
| interfaces | 外部介面 (HTTP/gRPC/CLI),只呼叫 application 層 |
| app/bootstrap | DI / wiring,建立 repository / service / use case / handler |
呼叫流程:
HTTP Request → interfaces/handler → application/command → domain/aggregate + domain/service → repository → DB