Theo tôi hiểu, một điểm chính là tách Logic miền (Logic nghiệp vụ) khỏi Cơ sở hạ tầng (DB, Hệ thống tệp, v.v.).
Đây là nền tảng của sự hiểu lầm: mục đích của DDD không phải là phân tách mọi thứ theo một đường cứng như "đây là trong máy chủ SQL, vì vậy không phải là BL", mục đích của DDD là tách các miền và tạo ra các rào cản giữa chúng cho phép các phần bên trong của một miền tách biệt hoàn toàn với các phần bên trong của một tên miền khác và để xác định các phần bên ngoài được chia sẻ giữa chúng.
Đừng nghĩ rằng "đang ở trong SQL" như là rào cản BL / DL mà không phải như vậy. Thay vào đó, hãy nghĩ rằng "đây là sự kết thúc của miền nội bộ" là rào cản.
Mỗi miền phải có API đối diện bên ngoài cho phép nó hoạt động với tất cả các miền khác : trong trường hợp lớp lưu trữ dữ liệu , nó sẽ có các hành động đọc / ghi (CRUD) cho các đối tượng dữ liệu mà nó lưu trữ. Điều này có nghĩa là chính SQL không thực sự là rào cản, VIEW
và PROCEDURE
các thành phần là. Bạn không bao giờ nên đọc trực tiếp từ bảng: đó là chi tiết triển khai DDD cho chúng ta biết rằng, là một người tiêu dùng bên ngoài, chúng ta không nên lo lắng.
Hãy xem xét ví dụ của bạn:
Điều tôi băn khoăn là, điều gì xảy ra khi tôi có các truy vấn rất phức tạp như Truy vấn tính toán tài nguyên vật liệu? Trong loại truy vấn mà bạn làm việc với các hoạt động tập nặng, loại điều mà SQL được thiết kế cho.
Đây chính xác là những gì nên có trong SQL và đó không phải là vi phạm DDD. Đó là những gì chúng tôi đã tạo ra DDD cho . Với tính toán đó trong SQL, đó trở thành một phần của BL / DL. Những gì bạn sẽ làm là sử dụng một chế độ xem / thủ tục được lưu trữ riêng biệt / những gì bạn có và giữ logic nghiệp vụ tách biệt khỏi lớp dữ liệu, vì đó là API bên ngoài của bạn. Trên thực tế, lớp dữ liệu của bạn phải là một Lớp Miền DDD khác, trong đó lớp dữ liệu của bạn có các tóm tắt riêng để hoạt động với các lớp miền khác.
Thực hiện các tính toán này trong cơ sở hạ tầng cũng không thể xảy ra, vì mẫu DDD cho phép thay đổi cơ sở hạ tầng mà không thay đổi Lớp Miền và biết rằng MongoDB không có các khả năng tương tự như SQL Server, điều đó không thể xảy ra.
Đó là một sự hiểu lầm khác: nó nói chi tiết triển khai trong nội bộ có thể thay đổi mà không thay đổi các lớp miền khác . Nó không nói rằng bạn chỉ có thể thay thế toàn bộ cơ sở hạ tầng.
Một lần nữa, hãy nhớ rằng, DDD là về việc ẩn nội bộ với các API bên ngoài được xác định rõ. Trường hợp các API đó là một câu hỏi hoàn toàn khác và DDD không xác định điều đó. Nó chỉ đơn giản xác định rằng các API này tồn tại và không bao giờ nên thay đổi .
DDD không được thiết lập để cho phép bạn thay thế MSSQL bằng MongoDB, đó là hai thành phần cơ sở hạ tầng hoàn toàn khác nhau.
Thay vào đó, hãy sử dụng một sự tương tự cho những gì DDD định nghĩa: xăng so với ô tô điện. Cả hai phương tiện đều có hai phương pháp hoàn toàn khác nhau để tạo lực đẩy, nhưng chúng có cùng API: bật / tắt, bướm ga / phanh và bánh xe để đẩy xe. DDD nói rằng chúng ta sẽ có thể thay thế động cơ (xăng hoặc điện) trong xe hơi của chúng ta. Điều đó không nói rằng chúng ta có thể thay thế ô tô bằng xe máy và đó chính là MSSQL → MongoDB.