Port - Cổng giao tiếp
Port đại diện cho một điểm tương tác giữa ứng dụng và thế giới bên ngoài, được định nghĩa trừu tượng (thường là interface hoặc một hợp đồng quy ước). Đây là một trong hai khái niệm cốt lõi của Hexagonal Architecture - Ports and Adapters.
Bản thân port không làm gì - nó chỉ định nghĩa “muốn tương tác thì phải theo chuẩn này”.
🔵 Hai loại Port
Port đầu vào (Primary / Input Port)
Cách ứng dụng nhận yêu cầu thực thi use case:
- Giao diện người dùng (web UI, mobile app), API bên ngoài gọi vào, script CLI, thậm chí bộ test tự động.
- Mỗi kênh vào nên có một port tương ứng.
- Với input port, có thể không cần interface cụ thể - mỗi cách vào có một thành phần xử lý riêng (Controller web = cổng nhận HTTP,
ConsoleCommand= cổng nhận CLI). Hoặc trừu tượng cao hơn: interfaceOrderPlacementUIvớiaskForOrderDetails().
Port đầu ra (Secondary / Output Port)
Cách ứng dụng gửi dữ liệu/yêu cầu ra ngoài:
- Lưu trữ dữ liệu (Persistence port), gửi thông báo (Notification port), gọi dịch vụ ngoài (External Service port).
- Ví dụ điển hình: Repository Pattern interface chính là Output Port (ứng dụng cần lưu/đọc → gọi qua repository interface, ai thực hiện không quan tâm). Tương tự
NotificationService.
📏 Độ rộng của Port
Một port có thể rộng hay hẹp tùy thiết kế. Cockburn nói: cực đoan thì mỗi use case là một port riêng. Thực tế hay gọn lại: tạo port theo nhóm chức năng (một PersistencePort chung, hoặc tách theo loại tác nhân: UserInterfacePort, PartnerApiPort).
Quan trọng là xác định đúng những cổng cần thiết để ứng dụng giao tiếp, từ đó chuẩn hóa sự tương tác.
Liên quan
- Adapter - Bộ chuyển đổi - cái cắm vào port
- Hexagonal Architecture - Ports and Adapters
- Repository Pattern - một Output Port điển hình
- Program to Interface - Tập trung vào trừu tượng - tư tưởng nền