Khái niệm service trong application layer và domain layer (mô hình DDD)

Có bác nào đã từng làm qua mô hình domain drive design không ạ, em có xem qua 1 số project sample trên github thì thấy có 2 khái niệm application service và domain service, nhưng không clear lắm, anh em nào làm rồi có thể chia sẻ được không ạ. Thanks

Khái niệm Application Layer nó rất chung chung, vì cái gì không thuộc Domain Layer thì sẽ thuộc Application Layer. Theo kinh nghiệm thì mình sẽ đổi tên thể hiện đúng chức năng của nó, như:

  • Web Layer: nhận request chung, trả về HTML
  • RESTful Layer: nhận request với prefix nào đó (/api), trả về JSON, XML
  • GUI Layer (Desktop, Mobile): các thao tác liên quan đến UI, như UIController (iOS), Activity (Android), Form (C#),…

Layer nào cũng sẽ có 1 phần code, hay class, gọi là Service, là nơi thực hiện các chức năng chính của Layer bằng cách sử dụng các Entity, Repository, DTO (Value Object), Factory,… thuộc cùng một Layer.

Nhưng không ai cứng nhắc đặt tên Service cho từng Layer cả, mà sẽ linh hoạt bằng cách thay nó bằng một tên khác, gộp hoặc tách các phần của Layer (Service, Entity, …). Nếu có ai mới vào project mà không biết DDD là gì thì cũng làm được mà không cần phải hiểu về DDD.

  • Trong mô hình Web MVC, Service là Controller. Nếu chỉ xét Model thôi thì class Model có thể xem là Service (Model = Entity + Repository + Factory).
  • Trong Android, Activity là Service, nếu viết theo MVP thì Presenter lại là Service.
  • Trong React Redux, Reducer là Service (chính xác hơn là Input Service).

Xem xét về cái React, giờ giả sử bạn không hiểu DDD là cái gì hết cả, nhưng đọc React docs thì họ nói nên phân chia UI thành các component, mỗi component là class. Presentational Component chỉ hiển thị view, Container Component thì được phép thêm state trong nó. Theo DDD, React đóng vai trò là View Layer, trong đó Service là root container (thường có tên là AppComponent), Factory là higher-order component, Value Object là các giá trị props truyền từ parent component sang child component. Entity là mấy Component :v

Gắn thêm Redux nữa, đóng vai trò là State Layer (hoặc Data Layer), Action là Value Object truyền đến Reducer, Reducer là Input Service, State là Entity kiêm Repository, Hai function mapStateToProps()mapDispatchToProps() là Output Service, không có Factory trong Redux.


Tóm lại là bạn nên vận dụng linh hoạt mấy thuật ngữ DDD, đừng áp dụng máy móc quá :v
Còn việc nên chia Layer thế nào cho phù hợp lại là chuyện khác.

(Chém tới đây là hết rồi)

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?