Dependency Rule - Quy tắc phụ thuộc một chiều

Quy tắc phụ thuộc (Dependency Rule): trong kiến trúc phân lớp hướng domain, code ở tầng trong không được phụ thuộc vào code ở tầng ngoài. Phụ thuộc chỉ đi một chiều: từ ngoài vào trong.

Đây là luật xương sống của Layered Architecture - Kiến trúc Phân lớp, Clean Architecture và Hexagonal Architecture - Ports and Adapters.

➡️ Chiều phụ thuộc

  • Tầng Domain độc lập hoàn toàn - không biết gì về những thứ bên ngoài nó.
  • Tầng Application phụ thuộc Domain (gọi entity, dùng interface repository).
  • Tầng Infrastructure phụ thuộc Application và Domain (triển khai interface, dùng Value Object của domain).
  • Presentation (nếu tách riêng) phụ thuộc Application hoặc trực tiếp Domain (khi hiển thị read model).

Sơ đồ (mũi tên = hướng phụ thuộc compile-time từ ngoài vào trong):

[ Giao diện người dùng ] → [ Application ] → [ Domain ] ← [ Infrastructure ]
   (Controller)              (Service)        (Entity)      (ORM, Framework)

🔄 Nghịch lý: Infrastructure phụ thuộc Domain nhưng Domain không biết Infrastructure

Chú ý mũi tên từ Infrastructure hướng vào Domain. Làm sao Infrastructure (lớp lưu DB thật) lại phục vụ Domain mà Domain không phụ thuộc nó?

→ Nhờ Dependency Inversion Principle: Domain định nghĩa interface (port), Infrastructure triển khai interface đó. Compile-time, Infrastructure phụ thuộc abstraction của Domain; runtime, Dependency Injection tiêm implementation cụ thể vào. Domain chỉ biết interface, “mù tịt” về implementation.

🔁 Luồng chạy vs luồng phụ thuộc

  • Luồng chạy (runtime): request từ ngoài → Controller → Application Service → Domain → Domain có thể yêu cầu hạ tầng (lưu DB, gửi mail) thông qua interface (port) → Application/Infrastructure thực hiện → kết quả quay ra Presentation.
  • Luồng phụ thuộc (compile-time): luôn hướng vào trong.

Đây là biểu hiện của Hollywood Principle: “Don’t call us, we’ll call you” - domain không gọi ra ngoài, mà được gọi vào.

Liên quan