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

PortAdapter thậtAdapter giả (test)
UserInterfaceWebController (HTTP), ConsoleCommand (CLI)-
PersistenceEloquentOrderRepository (MySQL), MongoOrderRepositoryInMemoryOrderRepository
NotificationEmailOrderNotification (SMTP)LogOrderNotification
External PaymentStripePaymentClientFakePaymentGateway

📌 Đặc điểm

  1. 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ì).
  2. 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