Agrega Kökü Nedir?


447

Havuz deseninin nasıl düzgün bir şekilde kullanılacağını araştırmaya çalışıyorum. Aggregate Root'un merkezi konsepti ortaya çıkmaya devam ediyor. Toplam bir kökün ne olduğu konusunda yardım için hem web'de hem de Yığın Taşması'nda arama yaparken, onlar hakkında tartışmalar ve temel tanımları içermesi gereken sayfalara ölü bağlantılar bulmaya devam ediyorum.

Havuz modeli bağlamında, toplam kök nedir?


16
Aşağıdaki örnek olayları gözden geçirmeyi düşünün. Etkili Agrega Tasarımı Bölüm I: Tek Bir Agrega Modelleme dddcommunity.org/wp-content/uploads/files/pdf_articles/… Bölüm II: Agregaların Birlikte Çalışmasını Sağlama dddcommunity.org/wp-content/uploads/files/pdf_articles/… Bölüm III: Keşif Yoluyla Bilgi Edinme dddcommunity.org/wp-content/uploads/files/pdf_articles/…
Ben Vitale

Yanıtlar:


310

Havuz kalıbı bağlamında, toplu kod kökleri istemci kodunuzun depodan yüklediği tek nesnedir.

Havuz, alt nesnelere erişimi kapsar - arayanın bakış açısından, kök yüklenirken ya da gerçekten ihtiyaç duyulduğunda (tembel yüklemede olduğu gibi) bunları otomatik olarak yükler.

Örneğin, Orderbirden çok LineItemnesne üzerindeki işlemleri kapsülleyen bir nesneniz olabilir . İstemci kodunuz LineItemnesneleri doğrudan doğrudan yüklemez , yalnızca Orderbunları içerir ; bu, alan adınızın o bölümü için toplam kök olur.


21
Varsayımsal olarak, istemci kodu başka bir amaçla LineItem'e ihtiyaç duyuyorsa, bu ayrı bir toplama oluşturur (Order nesnesiyle ilgili olmayan ilgili başka nesneler olacağını varsayarsak)?
Ahmad

20
@Ahmad, diğer toplamalar LineItems'e salt okunur veri olarak başvurabilir, bunları değiştiremezler . Diğer toplamalar bunları değiştirebilirse, siparişin değişmezlerini (veya satır öğelerini ') koruyamazsınız.
Jeff Sternal

4
Şuna bir göz atın, örneğin lostechies.com/blogs/jimmy_bogard/archive/2010/02/23/… . Örnekte, Müşteri Siparişin değişmezidir, değil mi? Ancak, Müşteri başka bir toplam kök olabilir mi? Yoksa burada temel bir anlayış eksik mi?
Ahmad

3
@Jeff "Onları değiştiremezler" dediniz - bu uygulanabilir mi, yoksa konvansiyon meselesi mi?
Neil Barnwell

4
@Neil: Mümkün olan dil mekanizmalarını kullanarak, örneğin verileri temsil etmek için değişmez bir sınıf oluşturarak bunu uygularım.
Jeff Sternal

206

Evans DDD'den:

TOPLAMA, veri değişiklikleri amacıyla bir birim olarak ele aldığımız ilişkili nesneler kümesidir. Her AGREGATE'in bir kökü ve bir sınırı vardır. Sınır, AGREGATE'in içinde ne olduğunu tanımlar. Kök AGGREGATE içinde yer alan tek bir spesifik ENTITY'dir.

Ve:

Kök, AGGREGATE'in dış nesnelerinin [.] Referanslarını tutmasına izin verilen tek üyesidir.

Bu, birleştirilmiş köklerin bir depodan yüklenebilen tek nesne olduğu anlamına gelir.

Bir örnek, bir Customervarlık ve bir Addressvarlık içeren bir modeldir . Bir Addressvarlığın bağlamı olmadan hiçbir anlam ifade etmediği için bir varlığa asla doğrudan modelden erişemeyiz Customer. Böylece şunu söyleyebiliriz Customerve Addressbirlikte bir agrega oluştururlar ve bu Customerbir agrega köküdür.


57
Eric Evans'ın güncellemesi : toplam köklerin işlemler / eşzamanlılık için tutarlılık sınırları olduğunu ve dış varlıkların diğer toplamların alt varlıklarına referans veremeyeceğini vurgulayın.
Brian Low

3
Yani sözler sonsuza dek beni karıştırıyor. Each AGGREGATE has a rootve The root is the only *member* of the AGGREGATE- bu döküntü, kökün Agrega üzerinde mülkiyet olduğunu ima eder. Ancak tüm örneklerde, bunun tersi de geçerlidir: kök, agrega olan özellikler içerir. Açıklayabilir misin?
Sinaestetik

1
Sadece benim dilimi doğru yapmak için, Customersınıf toplu kök veya Customer örnekler olarak kabul ediliyor mu?
Joe

1
Genel olarak, Müşteri siparişi satır öğesi paradigmasında konuşmak gerekirse, Müşteri Toplam Kök olacaktır. Bir müşterinin Eşgörünümü, bu Toplam Kök'ün bir örneği olacaktır. Müşteri adlı bir Toplam Kökten bahsederken, bir müşterinin örneğini oluşturan bir Müşterinin mantıklı yapısını tartışıyorsunuz. Müşterilerin bir koleksiyonu sadece bir koleksiyondur.
Ibrahim Malluf

111

Agrega kökü basit bir fikir için karmaşık bir isimdir.


Genel fikir

İyi tasarlanmış sınıf diyagramı iç kısımlarını kapsar. Bu yapıya eriştiğiniz nokta denir aggregate root.

resim açıklamasını buraya girin

Çözümünüzün içi çok karmaşık olabilir, ancak bu hiyerarşinin kullanıcısı sadece kullanacaktır root.doSomethingWhichHasBusinessMeaning().


Misal

Bu basit sınıf hiyerarşisini kontrol edin resim açıklamasını buraya girin

Arabanı nasıl sürmek istiyorsun? Daha iyi API seç

Seçenek A (bir şekilde çalışır):

car.ride();

Seçenek B (kullanıcının sınıf içsellerine erişimi vardır):

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

A seçeneğinin daha iyi olduğunu düşünüyorsanız tebrikler. Geride ana nedeniniz var aggregate root.


Toplama kökü birden çok sınıfı kapsar. tüm hiyerarşiyi yalnızca ana nesne üzerinden değiştirebilirsiniz.


17
Örneği seviyorum, ancak Müşterinin Engine'e başvurması gereken bir senaryo bulmakta zorlanıyorum. Motorun Arabanın arkasında kapsüllenmesi gerektiği anlaşılıyor. Bu konuyu biraz açıklayabilir misiniz?
emragins

Bence motorun kendisi araca özgü bir model içinde olmalı, örneğin 3000cc motorlu bir BMW 5 serisi. Bu modelleme ile motor bir otomobilin bileşenidir.
Parama Dharmika

1
@ParamaDharmika, bu şekilde modelleyebilirsiniz. Bu, müşterilerinizin arabalarla ne kadar 'gelişmiş' olduğuna bağlıdır. Temel modelde cartoplam köke erişmesi gerekir . Çizimdeki gibi bir duruma da izin verebilirsiniz. Doğru çözüm iş uygulama modeline bağlıdır. Her durumda farklı olabilir.
Marcin Szymczak

1
@MarcinSzymczak doğru, çözümün etki alanı modeline bağlı olduğuna daha fazla katılamadı
Parama Dharmika

Aslında, Tekerlek Lastiği (ve diğer parçaları) içeren bir agregadır. Kurallarınızda Tekerlek agregatına yalnızca Araba Kök Toplaması yoluyla erişilebilmesi gerekiyorsa, motora Araba Kök Toplaması içinde de bulunur ve Aracın dışına erişilmemelidir. Bu bir Araba örneği aleminde. Bir araba sahibi (Müşteri), arabası bağlamında bir motora referans vermez.
Ibrahim Malluf

35

Bir Bilgisayar varlığınız olduğunu, bu varlığın Yazılım varlığı ve Donanım varlığı olmadan da yaşayamayacağını düşünün. Bunlar Computer, etki alanının Bilgisayar bölümünün mini ekosistemini oluşturur.

Agrega Kökü, agrega içindeki annelik kuruluşudur (bizim durumumuzda Computer), deponuzun yalnızca Agrega Kökleri olan varlıklarla çalışmasını sağlamak yaygın bir uygulamadır ve bu kuruluş diğer kuruluşları başlatmaktan sorumludur.

Agrega Kökünü Agregaya Giriş Noktası olarak düşünün.

C # kodunda:

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 {}

Donanımın büyük olasılıkla bir ValueObject olacağını da unutmayın (kendi başına kimliğiniz yoktur), bunu sadece örnek olarak düşünün.


6
where T : IAggregateRoot- Bu benim günümü yaptı
Cristian E.

İfadeler biraz çelişkili, sanırım ve bunu öğrenmeye çalışırken beni şaşırtan şey bu. Bilgisayarın toplu olduğunu söylüyorsunuz, ama sonra kökün toplamın içindeki ana varlık olduğunu söylüyorsunuz. Peki bu örnekte toplam içindeki “annelik” varlığı hangisidir?
Sinaestetik

Gelecekten selamlar !. Adamın anlamı, Bilgisayarın kendi başına toplam kök olduğu, bilgisayar VE içindeki her şeyin toplam olduğu. Veya daha açık bir şekilde: durum kendi başına toplam kökenken, tüm bilgisayar toplamdır (bilgisayarı oluşturan her şeyin toplanmasıdır, örneğin RGB aydınlatma, Donanım, Güç Kaynağı, İşletim Sistemi, vb.)
Kaptan Kenpachi

IAggregateRoot tekniği Microsoft'un belgelerinde ortaya çıkıyor: docs.microsoft.com/en-us/dotnet/architecture/microservices/…
Samuel Danielson

16

Önce veritabanı yaklaşımını izlerseniz, toplam kök genellikle 1-çok ilişkinin 1 tarafında bulunan tablodur.

Bunun en yaygın örneği Kişi'dir. Her insanın birçok adresi vardır, bir veya daha fazla ödeme makbuzu, fatura, CRM girişi, vb. Her zaman böyle değildir, ancak 9/10 kez.

Şu anda bir e-ticaret platformu üzerinde çalışıyoruz ve temelde iki toplu kökenimiz var:

  1. Müşteriler
  2. Satıcılar

Müşteriler iletişim bilgilerini sağlar, onlara işlemler atarız, işlemler satır öğeleri alır, vb.

Satıcılar ürün satar, iletişim kişilerine, hakkımızda sayfalara, özel tekliflere vb.

Bunlar sırasıyla Müşteri ve Satıcı deposu tarafından halledilir.


8
Önce veritabanı yaklaşımını izlerseniz Etki Alanına Dayalı Tasarım uygulamıyorsunuz, Veriye Dayalı Tasarım'ı izliyorsunuz demektir.
Sinaesthetic

5
İnsanların sorunları çözmek ve / veya öğrenmek için geldikleri bir Soru-Cevap forumu - Bu sana alay etmiyordum. Tanım olarak, DDD her şeyden daha fazla bir zihniyettir ve birçokları için kafa karıştırıcıdır, bu yüzden bu, tasarım yöntemlerinin herhangi bir olası birleşmesini hafifletmek için DDD'yi öğrenenler için yorumun yapıldığından emin oldum.
Sinaesthetic

12

Dinah:

Havuz Bağlamında, Toplam Kök, üst Varlığı olmayan bir Varlıktır. Varlığı kimliği için Ebeveyne bağımlı olan sıfır, Bir veya Çok sayıda Çocuk Varlığı içerir. Bu bir Depodaki Bire Çok ilişkisidir. Bu Çocuk Varlıklar sade Agregalardır.

resim açıklamasını buraya girin


1
Yani, bir araba satıcısıysanız, Araba kendi başına bir toplu kök olur mu? Çünkü henüz müşterisi olmayan birçok
arabanız olabilir

2
@JorgeeFG gerçek cevap hiç kimsenin herhangi bir ipucu yoktur. Etrafta noktalı çok fazla bilgi var.
Mardoxx

3
Alt varlıklar toplu değildir, sadece toplu kökün kontrol ettiği toplamın üyesi olan varlıklardır. "Toplama", varlıkların mantıksal bir gruplamasıdır.
Sinaesthetic

@JorgeeFG gerçekten tasarladığınız sınırlı bağlama bağlıdır. Eğer bir araba satıcısı iseniz, o zaman bir Carshop gibi bir şey toplu kök haline gelir ve altında Arabalar takip ...
jokab

8

Bir itibaren kırık bağlantı :

Agrega içinde Agrega Kökü vardır. Agrega Kökü, Agrega içindeki diğer tüm Varlıkların ve Değer Nesnelerinin üst Varlığıdır.

Bir Havuz, Toplu Kök üzerinde çalışır.

Daha fazla bilgiyi burada da bulabilirsiniz .


4
Teşekkür ederim. Kesinlikle karşılaştığım en yaygın ve sinir bozucu kırık halka bu.
Dinah

Ayrıca, ifadeler geriye doğru görünüyor. Nasıl kök olabilir dahilinde aggreate ve aynı zamanda 's ebeveyn olmak?
Sinaestetik

1
Toplama Kökü kök sınıftır. Düz Agrega her zaman Agrega Kökü içinde bulunur. Yukarıda gösterilen Diyagramı kullanarak ... Müşteri Agrega Köküdür. Müşteri bir veya daha fazla araca sahip olabilir. Otomobiller, Müşteri ile ilişkili olarak Toplanır. Arabaların motoru var. Motor, Araba Toplamında bulunan bir Toplamdır. Müşteriyi Toplu Kök yapan modelin, bir araca veya bileşenlerine erişimin her zaman arabanın sahibi olan müşteriye ait olduğu varsayımıdır.
Ibrahim Malluf

8

Agrega bir şeyin toplanması anlamına gelir.
kök , ağacın üst düğümü gibidir, buradan <html>web sayfası belgesindeki düğüm gibi her şeye erişebiliriz .
Blog Analojisi, Bir kullanıcının birçok yayını olabilir ve her gönderinin birçok yorumu olabilir. bu nedenle herhangi bir kullanıcıyı getirirsek , ilgili yayınlara ve bu yayınların diğer yorumlarına erişmek için kök görevi görebilir . Bunların hep birlikte toplandığı veya Toplandığı söyleniyor


1

Aggregate, erişim düşüncesi toplam kökünü sınırlandırarak değişmezlerinizi koruduğunuz ve tutarlılığı zorladığınız yerdir. Unutmayın, agrega, veritabanı ilişkinizi değil, proje iş kurallarınızı ve değişmezlerinizi tasarlamalıdır. herhangi bir depo enjekte etmemelisiniz ve hiçbir sorguya izin verilmez.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.