Chúng tôi đang cố gắng áp dụng Thiết kế theo hướng miền trong dự án của chúng tôi lần đầu tiên. Vấn đề tôi gặp phải là liên quan giữa các thực thể. Làm thế nào để bạn làm đúng?Cách đúng để triển khai các hiệp hội trong DDD?
Giả sử, tôi có các thực thể Employee
và Contract
, một liên kết một-nhiều đơn giản. Làm thế nào để tôi mô hình hóa nó?
Tùy chọn 1: Tổng hợp.
Vấn đề: Vấn đề ở đây là, nếu tôi hiểu chính xác, tất cả các thực thể trong tổng hợp phải được tải khi một đối tượng tổng hợp được tạo. Tôi không thể lười biếng tải các thực thể khi chúng là cần thiết vì nó sẽ yêu cầu tham chiếu đến một kho lưu trữ từ một thực thể, mà dường như là xấu. Nhưng lấy tất cả các hợp đồng của nhân viên từ cơ sở dữ liệu mỗi lần sẽ là một vấn đề hiệu suất lớn.
Phương án 2: Tìm nạp các hợp đồng của nhân viên bằng cách sử dụng một kho lưu trữ (ví dụ ContractRepository.GetContractsForEmployee()
) và thêm EmployeeId
tài sản để Contract
lớp.
Sự cố: khiến bạn khó đưa bất kỳ logic nghiệp vụ nào vào thực thể. Tôi muốn có một phương pháp, ví dụ: Employee.Dismiss()
, nhưng cũng cần phải cập nhật hợp đồng của nhân viên. Điều này có nghĩa là tôi sẽ cần phải đặt logic này trong một dịch vụ. Vấn đề là, tôi không thể nghĩ nhiều logic chỉ hoạt động trên Employee
và do đó mô hình sẽ trở nên hơi thiếu máu, với hầu hết các logic bên trong các dịch vụ.
Làm cách nào để giải quyết các vấn đề này trong DDD?
Khi bạn đang nghĩ 'một liên kết đơn giản tới nhiều' bạn không làm DDD, bạn đang làm thiết kế lược đồ cơ sở dữ liệu. Các hiệp hội giữa các thực thể nên là hành vi. Một nhân viên không thể loại bỏ chính nó, nó phải được bác bỏ (bởi một thực thể khác có quyền làm điều đó). Tùy chọn 2 là đúng. Bạn không cần phải nghĩ ra nhiều hành vi cho một thực thể. Nếu một đối tượng miền là rất đơn giản trong kinh doanh thực tế, mô hình nó theo cách đó. Nó quan trọng như thế nào miền định nghĩa khái niệm (ngữ nghĩa) và không có bao nhiêu phương pháp đối tượng có. – MikeSW
MikeSW là chính xác. Một khía cạnh rất quan trọng của DDD là Ngôn ngữ phổ biến. Cách bạn nói về miền PHẢI là cách mà Chuyên gia miền nói về Miền nếu không mã sẽ trở nên khó xử và không trực quan. Nghe có vẻ tầm thường nhưng nếu bạn nhận được quyền này thì thực thể bắt đầu đề xuất hành vi. ví dụ. Employee.Resign(); Contract.Terminate(); – Asher