Domain Service

Domain Service là lớp chứa logic nghiệp vụ không gắn riêng vào một entity nào, nhưng vẫn thuộc về domain.

🎯 Khi nào cần Domain Service?

Đôi khi có nghiệp vụ không tự nhiên thuộc về một Domain Entity cụ thể - ví dụ dịch vụ tính phí vận chuyển dựa trên nhiều yếu tố (nhiều entity, nhiều quy tắc). Nếu nhét vào một entity thì gượng ép. Khi đó ta tạo domain service:

  • Là một lớp thuần túy chứa logic đó.
  • Thường là các hàm không trạng thái (stateless) - nhận input, xử lý, trả kết quả.
  • Vẫn thuộc Core Code là gì: không chạm DB/framework, chỉ thao tác trên domain model.

⚖️ Nguyên tắc “đẩy logic về đúng chỗ”

Nếu một hành vi thuộc về một entity → đặt nó trong entity. Chỉ khi hành vi trải rộng nhiều entity hoặc không thuộc riêng ai → mới tạo domain service.

Trong ví dụ đặt hàng e-book, logic đủ đơn giản để nằm trong Order entity hoặc Application Service, chưa cần domain service. Đừng lạm dụng domain service như một “túi đựng” logic - dễ biến entity thành mô hình “thiếu máu” (anemic).

🔀 Phân biệt với Application Service

  • Domain Service: chứa logic nghiệp vụ (quy tắc domain), thuộc Tầng Domain.
  • Application Service: điều phối use case (gọi repository, entity, gửi event), thuộc Tầng Application. Không chứa quy tắc nghiệp vụ chi tiết.

Liên quan