DDD: apakah benar untuk agregat root untuk menyimpan referensi ke agregat root lain?

16

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.

Lesair Valmont
sumber
Apa yang Anda maksud dengan "entitas internal (yang merupakan entitas root pada agregat terpisah)"?
Erik Eidt
2
FWIW, Apa pun dapat merujuk pada entitas root agregat karena ini adalah hal-hal yang memiliki identitas global; apakah pengarah itu sendiri merupakan entitas root atau tidak tidak penting.
Erik Eidt
Seperti kata Erik. Juga, tidak masalah jika Anda referensi menggunakan ID atau referensi dalam model Anda. Keduanya akan dikonversi ke ID pada tingkat DB dan memiliki referensi memberikan kemampuan ORM untuk memuat-malas entitas sesuai permintaan.
Euforia

Jawaban:

21

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,

  • Praktik baik yang diterima secara umum adalah merujuk ke AR dengan menyimpan ID-nya, bukan referensi lengkap.
  • Pendekatan yang lebih modern untuk desain agregat (lihat Buku Merah ) menganjurkan pemisahan yang lebih bersih antara Agregat. Transaksi bisnis seharusnya hanya mengubah status Agregat tunggal. Berdasarkan asumsi ini, kebutuhan untuk menyimpan referensi ke Agregat lain cenderung menghilang karena Anda tidak akan mengubah 2 agregat pada saat yang sama.

apakah benar untuk agregat root untuk memegang referensi ke entitas internal yang kebetulan menjadi entitas root pada agregat terpisah?

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

guillaume31
sumber
Terima kasih Guillaume untuk jawaban yang jelas, singkat dan berwawasan luas. Savoir-faire penikmat DDD sejati. Ini yang saya cari. Chapeau!
Lesair Valmont
Saya tahu ini mungkin pertanyaan konyol, tetapi bisakah saya bertanya apa artinya holding a referencedalam konteks ini? karena saya bingung ketika Anda mengatakan itu: holding a reference to a root is legitkemudian 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.
Anyname Donotcare
1
Tahan referensi = pertahankan internal / tahan lama, sebagai anggota kelas. Dikotomi di sini adalah root vs non-root. Anda dapat berpegangan pada referensi root tetapi bukan referensi non-root.
guillaume31
@ guillaume31 terima kasih banyak, tetapi bisakah saya bertanya apakah boleh untuk tetap mempertahankan identitas internal (bukan-root) ke agregat lain atau ini melanggar apakah (root atau tidak)?
Anyname Donotcare
Apa yang akan Anda lakukan dengan ID itu? Bahkan repositori hanya memberi Anda akar, bukan entitas internal.
guillaume31
1

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

Ewan
sumber
Ewan, saya lebih berpikir untuk menggunakan kembali kelas antara dua agregasi yang berbeda dalam arti OOP, daripada memiliki layanan domain yang bertindak sebagai skrip bisnis yang akan melakukan beberapa pekerjaan dengan dua agregat DDD yang berbeda. Kesimpulannya saya setuju dengan Anda, root agregat saya seharusnya hanya memiliki properti yang merupakan bagian dari domainnya.
Lesair Valmont