Apa itu Root Agregat?


447

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?


16
Pertimbangkan meninjau studi kasus berikut. Desain Agregat Efektif Bagian I: Memodelkan Agregat Tunggal dddcommunity.org/wp-content/uploads/files/pdf_articles/… Bagian II: Membuat Agregat Bekerja Sama dddcommunity.org/wp-content/uploads/files/pdf_articles/… Bagian III: Memperoleh Wawasan Melalui Penemuan dddcommunity.org/wp-content/uploads/files/pdf_articles/…
Ben Vitale

Jawaban:


310

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 Orderobjek yang merangkum operasi pada beberapa LineItemobjek. Kode klien Anda tidak akan pernah memuat LineItemobjek secara langsung, hanya Orderyang mengandungnya, yang akan menjadi akar agregat untuk bagian dari domain Anda.


21
Secara hipotesis, jika kode klien membutuhkan LineItem untuk tujuan lain, apakah itu akan membentuk agregat terpisah (dengan asumsi akan ada objek lain yang terlibat yang tidak terkait dengan objek Order)?
Ahmad

20
@Ahmad, agregat lain mungkin menyebut LineItems sebagai data hanya-baca, mereka tidak bisa mengubahnya . Jika agregat lain bisa mengubahnya, Anda tidak bisa melindungi invarian pesanan (maupun item baris ').
Jeff Sternal

4
Lihatlah ini misalnya lostechies.com/blogs/jimmy_bogard/archive/2010/02/23/… . Dalam contoh tersebut, Pelanggan adalah invarian dari Order, bukan? Namun, Pelanggan juga dapat menjadi akar agregat lainnya? Atau apakah saya kehilangan pemahaman mendasar di sini?
Ahmad

3
@ Jeff Anda mengatakan "mereka tidak bisa mengubahnya" - apakah itu dapat ditegakkan, atau masalah konvensi?
Neil Barnwell

4
@ Neil: Saya akan menegakkannya menggunakan mekanisme bahasa apa pun yang tersedia - misalnya, dengan membuat kelas yang tidak dapat diubah untuk mewakili data.
Jeff Sternal

206

Dari Evans DDD:

AGGREGATE adalah sekelompok objek terkait yang kami perlakukan sebagai unit untuk tujuan perubahan data. Setiap AGREGAT memiliki root dan batas. Batas mendefinisikan apa yang ada di dalam AGREGAT. Root adalah ENTITY tunggal, spesifik yang terkandung dalam AGREGAT.

Dan:

Root adalah satu-satunya anggota AGREGAT yang objek luarnya boleh memiliki referensi ke [.]

Ini berarti bahwa akar agregat adalah satu-satunya objek yang dapat diambil dari repositori.

Contohnya adalah model yang mengandung Customerentitas dan Addressentitas. Kami tidak akan pernah mengakses Addressentitas secara langsung dari model karena tidak masuk akal tanpa konteks yang terkait Customer. Jadi kita bisa mengatakan itu Customerdan Addressbersama - sama membentuk suatu agregat dan itu Customeradalah akar agregat.


57
Pembaruan dari Eric Evans : menekankan bahwa akar agregat adalah batas konsistensi untuk transaksi / konkurensi dan menekankan bahwa entitas luar tidak dapat memegang referensi ke entitas anak agregat lainnya.
Brian Low

3
Jadi kata-kata itu selamanya membingungkan saya. Each AGGREGATE has a rootdan The 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?
Sinaesthetic

1
Hanya untuk memperbaiki bahasa saya, apakah Customerkelas dianggap sebagai akar agregat, atau Customer contoh ?
Joe

1
Secara umum dalam paradigma item-pesanan-Pelanggan, Pelanggan akan menjadi Root Agregat. Instance dari pelanggan akan menjadi instance dari Root Agregat itu. Ketika berbicara tentang Root Agregat yang disebut Pelanggan, Anda mendiskusikan konstruksi logis dari Pelanggan yang membentuk instance dari pelanggan. Koleksi Pelanggan hanyalah koleksi.
Ibrahim Malluf

111

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.

masukkan deskripsi gambar di sini

Internal dari solusi Anda mungkin sangat rumit, tetapi pengguna hierarki ini hanya akan menggunakannya root.doSomethingWhichHasBusinessMeaning().


Contoh

Periksa hierarki kelas sederhana ini masukkan deskripsi gambar di sini

Bagaimana Anda ingin mengendarai mobil Anda? Pilih api yang lebih baik

Opsi A (itu entah bagaimana berfungsi):

car.ride();

Opsi B (pengguna memiliki akses ke inernals kelas):

if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
    for (Wheel w: car:getWheels()){
        w.spin();
    }
}

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.


17
Saya suka contohnya, tetapi saya berjuang untuk menemukan skenario di mana Pelanggan harus mereferensikan Mesin. Sepertinya Engine harus dikemas di belakang Mobil. Bisakah Anda menguraikan sedikit ini?
emragins

Menurut pendapat saya mesin itu sendiri harus berada di dalam model mobil tertentu, misalnya BMW seri 5 dengan mesin 3000cc. Dengan pemodelan ini mesin merupakan komponen untuk mobil.
Parama Dharmika

1
@ParamaDharmika yakin, Anda bisa memodelkannya seperti itu. Itu tergantung pada seberapa 'mahirnya' mobil pelanggan Anda. Dalam model dasar ia harus memiliki akses ke carroot agregat. Anda juga dapat membiarkan situasi seperti pada gambar. Solusi yang benar tergantung pada model bisnis aplikasi. Mungkin berbeda dalam setiap kasus.
Marcin Szymczak

1
@MarcinSzymczak benar, sangat setuju bahwa solusinya tergantung pada model domain itu sendiri
Parama Dharmika

Sebenarnya, Roda adalah agregat yang mengandung Ban (dan bagian lainnya). Jika aturan Anda mengharuskan agregat Roda hanya dapat diakses melalui Agregat Root Mobil, maka engine juga terdapat dalam Agregat Root Mobil dan tidak boleh diakses di luar Mobil. Itu di ranah instance Mobil. Pemilik mobil (Pelanggan) tidak akan mereferensikan mesin kecuali dalam konteks mobilnya.
Ibrahim Malluf

35

Bayangkan Anda memiliki entitas Komputer, entitas ini juga tidak dapat hidup tanpa entitas Perangkat Lunak dan entitas Perangkat Kerasnya. Ini membentuk Computeragregat, 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 #:

public class Computer : IEntity, IAggregateRoot
{
    public Hardware Hardware { get; set; }
    public Software Software { get; set; }
}

public class Hardware : IEntity { }
public class Software : IValueObject { }

public class Repository<T> : IRepository<T> where T : IAggregateRoot {}

Perlu diingat bahwa Perangkat Keras kemungkinan akan menjadi ValueObject juga (tidak memiliki identitas sendiri), menganggapnya sebagai contoh saja.


6
where T : IAggregateRoot- Yang ini membuat hariku
Cristian E.

Kata-katanya sedikit kontradiktif, saya pikir dan inilah yang membingungkan saya ketika mencoba mempelajari ini. Anda mengatakan bahwa Komputer adalah agregat, tetapi kemudian Anda mengatakan bahwa root akan menjadi entitas induk di dalam agregat. Jadi yang mana entitas "induk" di dalam agregat dalam contoh ini?
Sinaesthetic

Salam dari masa depan! Maksud orang itu adalah bahwa Komputer dengan sendirinya adalah akar agregat, sedangkan komputer DAN segala isinya adalah agregat. Atau lebih jelas: kasing itu sendiri adalah akar agregat, sedangkan seluruh komputer adalah agregat (kumpulan segala sesuatu yang membentuk "komputer, mis. Pencahayaan RGB, Perangkat Keras, Catu Daya, OS, dll.)
Kapten Kenpachi

Teknik IAggregateRoot muncul dalam dokumentasi Microsoft: docs.microsoft.com/en-us/dotnet/architecture/microservices/…
Samuel Danielson

16

Jika 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:

  1. Pelanggan
  2. Penjual

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.


8
Jika Anda mengikuti pendekatan basis data pertama maka Anda tidak berlatih Desain Domain Driven, Anda mengikuti Desain Data Driven.
Sinaesthetic

5
Ini adalah forum tanya jawab di mana orang-orang datang untuk menyelesaikan masalah dan / atau belajar - Itu bukan saya yang menyodok Anda. Menurut definisi, DDD adalah pola pikir lebih dari apa pun dan itu membingungkan bagi banyak orang, jadi ini adalah saya memastikan komentar dibuat untuk orang-orang yang mempelajari DDD dalam upaya untuk membantu mengurangi potensi penggabungan metodologi desain.
Sinaestetik

12

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.

masukkan deskripsi gambar di sini


1
Jadi, jika Anda seorang penjual mobil, maka Mobil akan menjadi akar agregat dengan sendirinya? Karena Anda dapat memiliki banyak mobil yang belum memiliki pelanggan
JorgeeFG

2
@JorgeeFG jawaban sebenarnya adalah tidak ada yang memiliki petunjuk sama sekali. Ada begitu banyak informasi yang saling bertentangan yang tersebar.
Mardoxx

3
Entitas anak bukan agregat, mereka hanya entitas yang kebetulan merupakan anggota dari agregat di mana agregat mengontrol root. "Agregat" adalah pengelompokan logis dari entitas.
Sinaesthetic

@JorgeeFG itu benar-benar tergantung pada konteks terbatas yang Anda rancang. Jika Anda seorang penjual mobil, maka sesuatu seperti Carshop menjadi akar agregat, dan di bawahnya mengikuti Cars ...
jokab

8

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 .


4
Terima kasih. Itu jelas merupakan tautan terputus yang paling umum dan membuat frustrasi yang terus-menerus saya temui.
Dina

Juga, kata-katanya nampak mundur. Bagaimana caranya menjadi root di dalam agreate dan menjadi induknya pada saat yang sama?
Sinaesthetic

1
Root Agregat adalah kelas root. Agregat polos selalu terkandung di dalam Agregat Root. Menggunakan Diagram yang ditunjukkan di atas ... Pelanggan adalah Agregat-Root. Pelanggan dapat memiliki satu atau lebih mobil. Mobil adalah Agregat sehubungan dengan Pelanggan. Mobil punya Mesin. Engine adalah Agregat yang terdapat dalam Agregat Mobil. Apa yang menjadikan Pelanggan sebagai Agregat Root adalah asumsi model bahwa akses ke mobil atau komponennya selalu melalui pelanggan yang memiliki mobil.
Ibrahim Malluf

8

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


1

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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.