Giải pháp tổng quan để tách biệt Core và Infrastructure

Làm thế nào để đạt được sự tách biệt? Về mặt kiến trúc, mục tiêu này được hiện thực qua các lớp (layer)mẫu thiết kế phù hợp. Đây là bản đồ tổng quan - mỗi kỹ thuật sẽ có note riêng.

🛠️ Các kỹ thuật cốt lõi

  1. Dùng Dependency InjectionInversion of Control. Thay vì core tự khởi tạo/gọi hạ tầng, ta đảo ngược phụ thuộc: core định nghĩa interface nó cần (OrderRepository, Mailer), infra cung cấp implementation (MySQLOrderRepository, SendGridMailer), inject vào lúc runtime. Đây là ứng dụng của Dependency Inversion Principle.
  2. Phân tầng kiến trúc rõ ràng. Tổ chức code thành Tầng Domain, Tầng Application, Tầng Infrastructure với luồng phụ thuộc một chiều (Dependency Rule - Quy tắc phụ thuộc một chiều).
  3. Áp dụng các design pattern thích hợp. Repository Pattern trừu tượng hóa truy xuất dữ liệu; Domain Model - Mô hình miền nghiệp vụ gom logic vào object; Factory Pattern tạo object thay vì gọi trực tiếp thư viện ngoài (vd Clock interface thay new DateTime()).
  4. Che giấu chi tiết hạ tầng sau abstract interface. Mọi tương tác ra ngoài (IO, DB, HTTP, file) đóng gói sau một lớp trừu tượng. Core chỉ gọi phương thức của lớp đó - xem Program to Interface - Tập trung vào trừu tượng.
  5. Tách riêng phần đặc thù framework. Controller Laravel chỉ nên chuyển tiếp request vào Application Service và trả response. Càng ít code “Laravel” xuất hiện trong domain càng tốt.

🎯 Tựu trung: tạo một ranh giới (boundary)

Giải pháp là tạo một ranh giới rõ ràng giữa ứng dụng và thế giới bên ngoài (framework, DB, file, dịch vụ khác). Phần code giao tiếp qua ranh giới đó chính là infrastructure - ta giữ nó tách khỏi phần logic bên trong.

Ranh giới này đôi khi được ví như “Ports and Adapters”: core cung cấp các port (interface), còn infrastructure là các adapter cắm vào port đó → cho phép hoán đổi adapter dễ dàng. Xem Hexagonal Architecture - Ports and Adapters.

Liên quan