Adapter - Bộ chuyển đổi
⚠️ Liên hệ nhưng khác Adapter Pattern của GoF. GoF Adapter là pattern nối 2 interface không tương thích. Adapter trong Hexagonal là phần code cụ thể kết nối một Port - Cổng giao tiếp với công nghệ/hệ thống thực tế - cùng tinh thần “chuyển đổi”, nhưng ở cấp kiến trúc.
Adapter là phần code cụ thể triển khai/gọi một port để nó hoạt động được với công nghệ thật. Mỗi port có ít nhất một adapter.
🔌 Ví dụ Adapter theo từng Port
| Port | Adapter thật | Adapter giả (test) |
|---|---|---|
UserInterface | WebController (HTTP), ConsoleCommand (CLI) | - |
Persistence | EloquentOrderRepository (MySQL), MongoOrderRepository | InMemoryOrderRepository |
Notification | EmailOrderNotification (SMTP) | LogOrderNotification |
External Payment | StripePaymentClient | FakePaymentGateway |
📌 Đặc điểm
- Chứa code rất cụ thể: xử lý giao thức, chuyển đổi dữ liệu qua lại giữa format bên ngoài và format bên trong ứng dụng → adapter thuộc Tầng Infrastructure (là Infrastructure Code là gì).
- Phụ thuộc vào port: adapter đầu ra implement interface của port; adapter đầu vào gọi phương thức của port. Nhờ Dependency Inversion Principle, thêm adapter mới không cần đổi gì ở core.
🔗 Quan hệ Port–Adapter theo nguyên tắc 1-n
Mỗi port có thể có nhiều adapter cùng cắm vào:
- Ít nhất một adapter thật để chạy production (DB thật, UI thật).
- Ít nhất một adapter giả phục vụ kiểm thử (in-memory DB, giả lập gửi mail).
Lại lấy hình ảnh cổng USB: cắm được chuột, bàn phím, USB drive, máy in… vào cùng một cổng. Thậm chí hai adapter lưu trữ (MySQL + MongoDB) chạy song song để thử nghiệm. Ứng dụng không cần biết - chỉ tương tác qua cổng chung.
Đây chính là điểm mạnh Cockburn nhắm tới: viết test nhanh bằng cách dùng adapter in-memory thay adapter thật chậm chạp.
Liên quan
- Port - Cổng giao tiếp - adapter cắm vào port
- Adapter Pattern - pattern GoF cùng tên, liên hệ nhưng khác cấp độ
- Hexagonal Architecture - Ports and Adapters
- Tầng Infrastructure · Infrastructure Code là gì