Saya mencoba mencari tahu bagaimana menggunakan pola repositori dengan benar. Konsep sentral dari Root Agregat terus muncul. Ketika mencari di web dan Stack Overflow untuk mencari tahu apa itu agregat root, saya tetap menemukan diskusi tentang mereka dan tautan mati ke halaman yang seharusnya berisi definisi dasar.
Dalam konteks pola repositori, apa itu root agregat?
Jawaban:
Dalam konteks pola repositori, akar agregat adalah satu-satunya objek yang diambil kode klien Anda dari repositori.
Repositori merangkum akses ke objek anak - dari perspektif penelepon, ia secara otomatis memuatnya, baik pada saat yang sama ketika root dimuat atau ketika mereka benar-benar dibutuhkan (seperti halnya lazy loading).
Misalnya, Anda mungkin memiliki
Order
objek yang merangkum operasi pada beberapaLineItem
objek. Kode klien Anda tidak akan pernah memuatLineItem
objek secara langsung, hanyaOrder
yang mengandungnya, yang akan menjadi akar agregat untuk bagian dari domain Anda.sumber
Dari Evans DDD:
Dan:
Ini berarti bahwa akar agregat adalah satu-satunya objek yang dapat diambil dari repositori.
Contohnya adalah model yang mengandung
Customer
entitas danAddress
entitas. Kami tidak akan pernah mengaksesAddress
entitas secara langsung dari model karena tidak masuk akal tanpa konteks yang terkaitCustomer
. Jadi kita bisa mengatakan ituCustomer
danAddress
bersama - sama membentuk suatu agregat dan ituCustomer
adalah akar agregat.sumber
Each AGGREGATE has a root
danThe root is the only *member* of the AGGREGATE
- verbage ini menyiratkan bahwa root adalah properti pada Agregat. Tetapi dalam semua contoh, ini sebaliknya: root berisi properti yang agregat. Bisakah Anda mengklarifikasi?Customer
kelas dianggap sebagai akar agregat, atauCustomer
contoh ?Root agregat adalah nama kompleks untuk ide sederhana.
Ide umum
Diagram kelas yang dirancang dengan baik merangkum bagian dalamnya. Titik di mana Anda mengakses struktur ini disebut
aggregate root
.Internal dari solusi Anda mungkin sangat rumit, tetapi pengguna hierarki ini hanya akan menggunakannya
root.doSomethingWhichHasBusinessMeaning()
.Contoh
Periksa hierarki kelas sederhana ini
Bagaimana Anda ingin mengendarai mobil Anda? Pilih api yang lebih baik
Opsi A (itu entah bagaimana berfungsi):
Opsi B (pengguna memiliki akses ke inernals kelas):
Jika Anda berpikir bahwa opsi A lebih baik maka selamat. Anda mendapatkan alasan utama di belakang
aggregate root
.Root agregat merangkum beberapa kelas. Anda dapat memanipulasi seluruh hierarki hanya melalui objek utama.
sumber
car
root agregat. Anda juga dapat membiarkan situasi seperti pada gambar. Solusi yang benar tergantung pada model bisnis aplikasi. Mungkin berbeda dalam setiap kasus.Bayangkan Anda memiliki entitas Komputer, entitas ini juga tidak dapat hidup tanpa entitas Perangkat Lunak dan entitas Perangkat Kerasnya. Ini membentuk
Computer
agregat, ekosistem mini untuk bagian Komputer dari domain.Agregat Root adalah entitas induk dalam agregat (dalam kasus kami
Computer
), itu adalah praktik umum untuk memiliki repositori Anda hanya bekerja dengan entitas yang merupakan Agregat Roots, dan entitas ini bertanggung jawab untuk menginisialisasi entitas lain.Pertimbangkan Agregat Root sebagai Entry-Point ke Agregat.
Dalam kode C #:
Perlu diingat bahwa Perangkat Keras kemungkinan akan menjadi ValueObject juga (tidak memiliki identitas sendiri), menganggapnya sebagai contoh saja.
sumber
where T : IAggregateRoot
- Yang ini membuat harikuJika Anda mengikuti pendekatan database-pertama, Anda agregat root biasanya tabel di sisi 1 dari hubungan 1-banyak.
Contoh paling umum adalah Orang. Setiap orang memiliki banyak alamat, satu slip pembayaran, faktur, entri CRM, dll. Tidak selalu demikian, tetapi 9/10 kali lipat.
Saat ini kami sedang mengerjakan platform e-commerce, dan pada dasarnya kami memiliki dua akar agregat:
Pelanggan memberikan info kontak, kami memberikan transaksi kepada mereka, transaksi mendapatkan item baris, dll.
Penjual menjual produk, memiliki kontak orang, tentang kami halaman, penawaran khusus, dll.
Ini diurus masing-masing oleh repositori Pelanggan dan Penjual.
sumber
Dina:
Dalam Konteks Repositori, Root Agregat adalah Entitas tanpa Entitas induk. Ini berisi nol, Satu atau Banyak Entitas Anak yang keberadaannya bergantung pada Induk untuk identitasnya. Itu hubungan One To Many dalam Repository. Entitas Anak tersebut adalah Agregat biasa.
sumber
Dari tautan yang rusak :
Di dalam Agregat ada Root Agregat. Root Agregat adalah Entitas induk untuk semua Entitas dan Objek Nilai lainnya dalam Agregat.
Repositori beroperasi pada Root Agregat.
Info lebih lanjut juga dapat ditemukan di sini .
sumber
Agregat berarti kumpulan sesuatu.
root seperti simpul teratas pohon, dari mana kita bisa mengakses semuanya
<html>
simpul dalam dokumen halaman web.Analogi Blog, Seorang pengguna dapat memiliki banyak posting dan setiap posting dapat memiliki banyak komentar. jadi jika kita mengambil pengguna mana pun maka itu dapat bertindak sebagai root untuk mengakses semua posting terkait dan komentar lebih lanjut dari posting tersebut. Ini semua bersama-sama dikatakan koleksi atau Agregat
sumber
Agregat adalah tempat Anda melindungi invarian Anda dan memaksakan konsistensi dengan membatasi aksesnya ke akar agregat pikiran. Jangan lupa, agregat harus dirancang berdasarkan aturan dan proyek bisnis invarian Anda, bukan hubungan basis data. Anda tidak boleh menyuntikkan repositori apa pun dan tidak ada permintaan yang tidak diizinkan.
sumber
Di Erlang tidak perlu membedakan antara agregat, setelah agregat disusun oleh struktur data di dalam negara, bukan komposisi OO. Lihat sebuah contoh: https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-london
sumber