DDD: có đúng không khi tổng hợp gốc giữ tham chiếu đến tổng hợp gốc khác?


16

Khi theo thiết kế hướng tên miền (DDD), liệu tổng hợp gốc có giữ tham chiếu đến một thực thể bên trong có thể là thực thể gốc trên một tổng hợp riêng không?

Tôi tin rằng điều này là không chính xác, chủ yếu là do quy tắc này trên cuốn sách màu xanh :

Không có gì bên ngoài ranh giới AGGREGATE có thể chứa một tham chiếu đến bất cứ thứ gì bên trong, ngoại trừ ENTITY gốc. ENTITY gốc có thể trao các tham chiếu đến ENTITY bên trong cho các đối tượng khác, nhưng các đối tượng đó chỉ có thể sử dụng chúng tạm thời và chúng không thể giữ tham chiếu. Rễ có thể trao một bản sao của ĐỐI TƯỢNG GIÁ TRỊ cho một đối tượng khác và không có vấn đề gì xảy ra với nó, bởi vì đó chỉ là một GIÁ TRỊ và sẽ không còn liên kết với AGGREGATE nữa.

Nếu một tổng hợp gốc giữ một tham chiếu đến một tổng hợp gốc khác thì ranh giới của trước đó bị vi phạm và toàn bộ khái niệm về một tổng hợp bị hỏng, vì vậy tôi tin rằng nếu một tổng hợp gốc có vẻ như cần phải giữ một tham chiếu đến tổng hợp gốc khác, thì tôi cần để tạo một thực thể khác , có thể sẽ chia sẻ một số thành viên giống như thực thể gốc khác, nhưng sẽ không có bản sắc toàn cầu, vì quy tắc khác này trong sách nêu rõ:

Root ENTIES có bản sắc toàn cầu. ĐỐI TƯỢNG bên trong ranh giới có bản sắc địa phương, duy nhất trong AGGREGATE.

Tôi tin rằng đây sẽ là con đường chính xác để đi, nhưng vì nó cảm thấy lặp đi lặp lại và dư thừa (khi được đưa ra khỏi bối cảnh của DDD, với OOP thuần túy) tôi đang yêu cầu một số phản hồi.


Bạn có ý nghĩa gì bởi "thực thể nội bộ (đó là thực thể gốc trên một tổng hợp riêng)"?
Erik Eidt

2
FWIW, Bất cứ điều gì cũng có thể đề cập đến một thực thể gốc tổng hợp vì đây là những thứ có bản sắc toàn cầu; cho dù người giới thiệu có phải là một thực thể gốc hay không là không quan trọng.
Erik Eidt

Như Erik đã nói. Ngoài ra, không có vấn đề gì nếu bạn tham chiếu nó bằng ID hoặc tham chiếu trong mô hình của bạn. Cả hai sẽ chuyển đổi thành ID ở cấp độ DB và có một tham chiếu cung cấp cho ORM khả năng tải thực thể theo yêu cầu.
Euphoric

Câu trả lời:


21

Bạn có thể đang diễn giải quá nhiều cuốn sách. Về cơ bản nó nói: mọi thứ bên ngoài một Uẩn đều không thể chứa một tham chiếu đến bất cứ thứ gì bên trong nó ngoại trừ gốc. Do đó, giữ một tài liệu tham khảo đến một gốc là hợp pháp. Giữ một tham chiếu đến một gốc không có nghĩa là nó là một phần của tổng hợp của riêng bạn và bạn có thể kiểm soát các bất biến của nó. Nó giữ bất biến và tự chủ của riêng mình.

Tuy nhiên,

  • Một thực tiễn tốt thường được chấp nhận là đề cập đến AR bằng cách lưu trữ ID của nó, không phải là tài liệu tham khảo đầy đủ.
  • Các cách tiếp cận hiện đại hơn để thiết kế tổng hợp (xem Sách đỏ ) ủng hộ sự tách biệt rõ ràng hơn giữa các Uẩn. Một giao dịch kinh doanh chỉ nên thay đổi trạng thái của một Tập hợp duy nhất. Theo giả định này, nhu cầu lưu trữ một tham chiếu đến một Tập hợp khác có xu hướng biến mất vì bạn sẽ không sửa đổi 2 tập hợp cùng một lúc.

Là chính xác cho một tổng hợp gốc để giữ một tham chiếu đến một thực thể nội bộ tình cờ là thực thể gốc trên một tổng hợp riêng biệt?

Điều này không bao giờ xảy ra. Đối tượng Giá trị có thể là một phần của nhiều Tập hợp, nhưng không phải là một Thực thể. Lý do là, sau đó không có gì ngăn bạn chia sẻ cùng một thực thể giữa các Tập hợp. Giả sử rằng thực thể E thuộc cả hai trường hợp tổng hợp A và B. Vì tiền đề của DDD là Tập hợp là điểm nhập cảnh, bạn sẽ có thể tải A, sửa đổi thực thể E thông qua nó, trong khi âm thầm vi phạm các bất biến từ B (mà bạn đã không tải).

Xem câu trả lời từ Greg Young tại đây: http://domain-driven-design.3010926.n2.nabble.com/Can-an-Entity-be-Shared-across-many-Aggregates-td7579277.html


Cảm ơn bạn Guillaume cho câu trả lời rõ ràng, súc tích và sâu sắc. Đúng là người sành sỏi của DDD. Đây là những gì tôi đang tìm kiếm. Chapeau!
Lesair Valmont

Tôi biết đó có thể là một câu hỏi ngớ ngẩn, nhưng tôi có thể hỏi ý nghĩa của holding a referencebối cảnh này là gì không? bởi vì tôi bối rối khi bạn nói rằng: holding a reference to a root is legitsau đó bạn nói:This never happens. A Value Object can be part of multiple Aggregates, but not an Entity. The reason is, nothing would then prevent you from sharing the same entity instance between Aggregates.
Anyname Donotcare

1
Giữ một tài liệu tham khảo = giữ nó bên trong / lâu dài, như một thành viên của lớp. Sự phân đôi ở đây là root vs non-root. Bạn có thể giữ một tham chiếu gốc nhưng không phải là tham chiếu không gốc.
guillaume31

@ guillaume31 cảm ơn rất nhiều, nhưng tôi có thể hỏi liệu có ổn không khi giữ một idthực thể bên trong (không phải root) trong một tập hợp khác hoặc điều này có vi phạm liệu (root hay không)?
Anyname Donotcare

Bạn sẽ làm gì với ID đó? Ngay cả các kho lưu trữ chỉ cung cấp cho bạn gốc, không phải các thực thể nội bộ.
guillaume31

1

Đối tượng gốc tổng hợp của bạn nên (nói chung) chỉ có các thuộc tính là một phần của miền của nó.

Nếu bạn có một đối tượng AR có thuộc tính không nằm trong tổng hợp thì bạn ngay lập tức phải đối mặt với câu hỏi. 'Tại sao không?'

Bạn có thể thêm Id của đối tượng khác có lẽ? Hoặc tiêm một kho lưu trữ?

Nhưng có vẻ như bạn nên thêm một dịch vụ tên miền chéo tham chiếu cả các đối tượng gốc và thực hiện logic cần thiết


Ewan, tôi đã suy nghĩ nhiều hơn về việc sử dụng lại một lớp giữa hai tập hợp khác nhau theo nghĩa OOP, thay vì có một dịch vụ miền hoạt động như một kịch bản kinh doanh sẽ thực hiện một số công việc với hai tập hợp DDD khác nhau. Để kết luận tôi đồng tình với bạn, gốc tổng hợp của tôi chỉ nên có các thuộc tính là một phần của miền của nó.
Lesair Valmont
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.