專案結構

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.goEntity / Value Object,純資料物件,不包含 DB 或 HTTP 邏輯
repository.goRepository interface + 簡單實作(DB CRUD),service 呼叫它
service.go業務邏輯 / Use Case,流程 orchestration、呼叫 repository
handler.goHTTP / gRPC Handler,解析 request → 呼叫 service → 回傳 response
util/logger.go共用工具函式,例如日誌、helper、驗證函式

呼叫流程

HTTP Request → handler.go → service.go → repository.go → DB

DDD(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/bootstrapDI / wiring,建立 repository / service / use case / handler

呼叫流程

HTTP Request → interfaces/handler → application/command → domain/aggregate + domain/service → repository → DB