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).
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ề