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
- Domain Model - Mô hình miền nghiệp vụ
- Domain Entity
- Application Service - dễ nhầm, khác vai trò
- Tầng Domain
- Single Responsibility Principle