Saat mengikuti desain yang digerakkan oleh Domain (DDD), apakah benar untuk agregat root untuk memegang referensi ke entitas internal yang kebetulan menjadi entitas root pada agregat terpisah?
Saya percaya ini tidak benar, terutama karena aturan tentang buku biru ini :
Tidak ada yang di luar batas AGGREGATE yang dapat menyimpan referensi ke apa pun di dalamnya, kecuali ke root ENTITY. Root ENTITY dapat menyerahkan referensi ke ENTITAS internal ke objek lain, tetapi objek tersebut dapat menggunakannya hanya sementara, dan mereka mungkin tidak berpegang pada referensi. Root dapat memberikan salinan VALUE OBJECT ke objek lain, dan tidak masalah apa yang terjadi padanya, karena itu hanya VALUE dan tidak lagi memiliki hubungan dengan AGGREGATE.
Jika agregat root memegang referensi ke agregat root lain batas dari yang pertama dilanggar dan seluruh konsep agregat rusak, jadi saya percaya jika agregat root sepertinya perlu memegang referensi ke agregat root lain, maka saya perlu untuk membuat entitas yang berbeda , yang mungkin akan berbagi beberapa anggota yang sama dengan entitas root lainnya, tetapi tidak akan memiliki identitas global, seperti yang dinyatakan oleh aturan lain dalam buku ini:
Root ENTITIES memiliki identitas global. ENTITIES di dalam batas memiliki identitas lokal, unik hanya di dalam AGREGAT.
Saya percaya ini akan menjadi cara yang benar untuk pergi, tetapi karena rasanya berulang dan berlebihan (ketika diambil dari konteks DDD, dengan OOP murni) saya meminta umpan balik.
sumber
Jawaban:
Anda mungkin menafsirkan buku terlalu banyak. Itu pada dasarnya mengatakan: apa pun di luar Agregat tidak dapat memiliki referensi untuk apa pun di dalamnya kecuali root. Oleh karena itu, memegang referensi ke root adalah sah. Memegang referensi ke root tidak berarti itu bagian dari agregat Anda sendiri dan bahwa Anda dapat mengontrol invariannya. Itu menjaga invarian dan otonomi sendiri.
Namun,
Ini tidak pernah terjadi. Objek Nilai dapat menjadi bagian dari beberapa Agregat, tetapi bukan Entitas. Alasannya adalah, tidak ada yang mencegah Anda berbagi instance entitas yang sama antara Agregat. Katakanlah instance entitas E milik instance Agregat A dan B. Karena premis DDD adalah bahwa Agregat adalah titik masuknya, Anda dapat memuat A, memodifikasi entitas E melalui itu, sambil secara diam-diam melanggar invarian dari B (yang tidak Anda muat).
Lihat jawaban dari Greg Young di sini: http://domain-driven-design.3010926.n2.nabble.com/Can-an-Entity-be-Shared-across-many-Aggregates-td7579277.html
sumber
holding a reference
dalam konteks ini? karena saya bingung ketika Anda mengatakan itu:holding a reference to a root is legit
kemudian setelah itu Anda berkata: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.
id
entitas internal (bukan-root) ke agregat lain atau ini melanggar apakah (root atau tidak)?Objek root agregat Anda seharusnya (umumnya) hanya memiliki properti yang merupakan bagian dari domainnya.
Jika Anda memiliki objek AR dengan properti yang tidak dalam agregat maka Anda segera dihadapkan dengan pertanyaan. 'Kenapa tidak?'
Anda dapat menambahkan ID dari objek lain mungkin? Atau menyuntikkan repositori?
Tapi sepertinya Anda harus menambahkan layanan lintas domain yang mereferensikan kedua objek root dan melakukan logika yang diperlukan
sumber