Ranh giới giữa Core và Infrastructure Code
Trong thực tế, không phải lúc nào cũng rõ 100% đoạn code nào là core hay infra - đôi khi ranh giới mờ nhạt. Vài nguyên tắc giúp định danh:
🧭 Các nguyên tắc phân định
- Core thường nằm ở domain & application logic: các class nghiệp vụ, use case thuần logic. Chúng có thể dùng Value Object (
Money,DateRange) để tránh phụ thuộc kiểu nguyên thủy. - Infra thường nằm ở lớp ngoài cùng: Controller, Repository implementation, Gateway, Provider của framework. Cố gắng giới hạn chúng ở rìa, không để “rò rỉ” vào domain.
- Đừng phụ thuộc vào vị trí thư mục, hãy phụ thuộc vào chức năng: một class trong
App/Utils/Calculatormà bên trong gọi cURL tới API lấy tỷ giá thì vẫn là infra. Ngược lại, một thư viện markdown parser trong/vendorparse text thuần có thể coi như core. - Câu hỏi vàng để định danh: “Đoạn code này có chạy độc lập, trong memory, không side effect ngoài không?” - Nếu “có cả hai” → core. Chỉ cần một “không” → infra.
🕐 Ví dụ vùng xám: lấy thời gian hiện tại
new DateTimeImmutable('now')- lấy giờ hệ thống là phụ thuộc môi trường (đồng hồ hệ thống), nhưng rất nhẹ và chấp nhận được trong core nếu truyền vào từ ngoài.- Muốn thật sạch: tạo
interface Clockvớinow()và implementationSystemClockgọiCarbon::now(). Core dùngClock->now()→ core không biết Carbon là gì. Xem Factory Pattern. - Ngược lại,
User::find(1)hayEvent Dispatchercủa Laravel thì chắc chắn là infrastructure.
💡 Chốt lại
Mục tiêu cuối cùng: để core code “không nhận ra” sự tồn tại của hạ tầng. Các Adapter - Bộ chuyển đổi bản chất là hạ tầng, nhưng chúng giúp cô lập hạ tầng tại một điểm duy nhất, giữ phần lõi luôn sạch.
Liên quan
- Core Code là gì
- Infrastructure Code là gì
- Hexagonal Architecture - Ports and Adapters - cách cô lập hạ tầng ở rìa
- Entity vs Value Object - Value Object giúp core tránh kiểu nguyên thủy