Trong mô hình DDD (Domain-Driven Design), các domain được thiết kế để phản ánh logic nghiệp vụ của hệ thống một cách rõ ràng và được phân tách dựa trên ngữ cảnh (Bounded Context). Việc liên kết giữa các domain (Bounded Contexts) được thực hiện thông qua các phương pháp sau:
- Phân cách domain qua Bounded Context Bounded Context đại diện cho một vùng trong hệ thống nơi một domain có các quy tắc và mô hình riêng. Các Bounded Contexts không nên phụ thuộc chặt chẽ vào nhau và chỉ tương tác khi cần thiết, thông qua các mối quan hệ rõ ràng.
- Các phương pháp liên kết domain a. Context Mapping Là kỹ thuật mô tả và định nghĩa cách các Bounded Contexts giao tiếp với nhau. Một số kiểu liên kết phổ biến: Shared Kernel: Chia sẻ một phần nhỏ của mô hình (ví dụ: một số lớp hoặc module chung). Customer-Supplier: Một context đóng vai trò cung cấp dữ liệu, context khác tiêu thụ dữ liệu đó. Published Language: Giao tiếp thông qua các định dạng tiêu chuẩn (VD: JSON, XML) hoặc ngôn ngữ chung. Anti-Corruption Layer (ACL): Lớp chống nhiễu, giúp dịch dữ liệu từ context này sang context khác để tránh làm hỏng logic của domain. b. Domain Events Domain Events được sử dụng để giao tiếp giữa các domain một cách lỏng lẻo. Ví dụ: Khi Domain A thực hiện một hành động, nó tạo ra một event như "OrderPlaced". Domain B lắng nghe sự kiện này và xử lý (ví dụ: cập nhật trạng thái kho). Ưu điểm: Tách biệt rõ ràng giữa domain phát sự kiện và domain xử lý sự kiện. Hỗ trợ hệ thống phân tán hoặc kiến trúc microservices. c. Application Services Application Services (dịch vụ ứng dụng) nằm ngoài domain và chịu trách nhiệm phối hợp các domain. Application Services thường: Gửi lệnh tới domain khác. Lấy kết quả từ domain và trả lại cho người dùng hoặc hệ thống khác. d. Repositories Các domain có thể giao tiếp gián tiếp thông qua repositories. Repository cho phép truy xuất và lưu trữ dữ liệu mà không cần phụ thuộc vào chi tiết cụ thể của database. e. Shared Database (hạn chế sử dụng) Các domain sử dụng chung cơ sở dữ liệu. Hạn chế: Có thể gây xung đột giữa các domain. Khó khăn trong việc bảo trì và mở rộng.
- Ví dụ thực tế Bối cảnh Giả sử bạn có một hệ thống thương mại điện tử với các domain sau:
Order Management: Quản lý đơn hàng.
Inventory Management: Quản lý kho.
Customer Management: Quản lý khách hàng.
Liên kết giữa các domain
Khi một đơn hàng được đặt:
Order Management tạo một Domain Event: OrderPlaced.
Inventory Management nhận sự kiện này, kiểm tra kho, và giảm số lượng tồn kho.
Customer Management:
Khi khách hàng tạo đơn hàng, Order Management có thể gọi một Application Service để:
Lấy thông tin khách hàng từ Customer Management.
Kiểm tra điều kiện hợp lệ của khách hàng trước khi xử lý đơn hàng.
Sử dụng ACL:
Nếu Inventory Management sử dụng hệ thống bên ngoài (ERP), lớp Anti-Corruption Layer chuyển đổi dữ liệu từ hệ thống ERP sang định dạng mà Inventory Management hiểu được.
- Các điểm cần lưu ý Cố gắng giảm phụ thuộc trực tiếp giữa các domain: Sử dụng sự kiện (Domain Events). Giao tiếp qua Application Services hoặc ACL. Phân định rạch ròi giữa các Bounded Contexts: Mỗi context chỉ quan tâm đến nghiệp vụ của mình. Sử dụng Context Mapping để xác định rõ ràng cách các domain liên kết với nhau. Tóm tắt Domain liên kết thông qua: Context Mapping, Domain Events, Application Services, ACL, hoặc Repositories. Cách tiếp cận khuyên dùng: Ưu tiên giao tiếp lỏng lẻo (Domain Events). Hạn chế chia sẻ trực tiếp dữ liệu hoặc phụ thuộc chặt chẽ. Mục tiêu là giữ mỗi domain độc lập và dễ dàng mở rộng khi cần.
Top comments (0)