mình lấy ví dụ trong Java nhé (giờ toàn code Java). Bên mình giờ code thế này:
Controller > Service > Data Service > Repository
Trong Controller dùng Dto với Mapper (Mapstruct) package level (interface xxxMapper, class xxxDto,
ko dùng public class Dto, public interface xxxMapper)
Trong Service dùng package level Mapper với public Domain Object (đây là
public class duy nhất trong đống Dto, Domain, Database Model Entity)
Data Service sẽ có default package level Mapper với default package level Database Model (
không dùng public Database Entity)
Các layer chỉ được gọi layer bên
phải, không được gọi ngược lại hay ngang hàng để tránh cyclic dependencies.
Ngoài ra nếu mình cần 2 kết quả của 2 Service thì trong package của Controller, mình tạo thêm 1 package level ServiceManager, gọi 2 service khác rồi trả lại kết quả cho Controller:
Controller > Service Manager > Service > Data Service > Repository
Cách làm này gần giống với Clean Architecture, sửa layer bất kì sẽ ko ảnh hưởng đến layer bên phải. Nhưng có thể dùng trong cùng 1 module (ko nhất thiết phải chia ra nhiều module như clean architecture).
Bạn nào có ý kiến khác thì reply để mình tham khảo thêm