L79 — Clean Architecture trong Go

Ba module tương tác: vòng tròn Dependency Rule & chiều mũi tên · tráo adapter Postgres ↔ InMemory mà lõi không đổi · luồng request handler → usecase → repository → response.

1. Dependency Rule — bốn vòng tròn & chiều phụ thuộc

Bấm vào từng vòng để xem nó chứa gì. Nút bên dưới bật/tắt mũi tên phụ thuộc và mô phỏng "mũi tên trỏ ra ngoài" (vi phạm).

Entities Use Cases Adapters Frameworks

Bấm một vòng tròn

Mỗi vòng là một tầng. Lõi trong cùng (Entities) quý nhất, ít đổi nhất. Vỏ ngoài (Frameworks) hay đổi nhất.

✓ Mũi tên trỏ vào trong: cmd → adapter → usecase → domain. Lõi không biết vỏ. Đúng Dependency Rule.

2. Ports & Adapters — tráo backend, lõi không đổi

Lõi (domain + usecase) phụ thuộc interface UserRepository. Bấm tráo adapter: chỉ ô màu cam (composition root + adapter) thay đổi, các ô lõi đứng yên.

domain.User — business rule, không đổi
usecase.UserUsecase — phụ thuộc interface UserRepository
port: UserRepository — do usecase định nghĩa, không đổi
adapter: memory.UserRepo — map trong RAM
Thay đổi khi tráo: chỉ adapter + 1 dòng composition root. 3 ô lõi phía trên: 0 dòng sửa.
Composition root (cmd/server/main.go)

      

3. Luồng một request — handler → usecase → repository → response

Mô phỏng POST /users đi qua các tầng rồi trả về. Bấm "Chạy" để xem từng bước; chú ý mỗi bước thuộc tầng nào (màu).

HTTP Handler
Use Case
Domain
Repository
↩ response đi ngược về