DDD: Bir kök toplamının başka bir kök toplamına referans tutması doğru mu?


17

Etki alanına dayalı tasarımı (DDD) izlerken, bir kök toplamı için ayrı bir toplamda kök varlık olan bir iç varlığa referans olması doğru mudur?

Bunun doğru olmadığına inanıyorum, esas olarak mavi kitaptaki bu kural nedeniyle :

AGGREGATE sınırının dışında hiçbir şey, kök ENTITY (kök ENTITY) dışında herhangi bir şeye referans veremez. Kök ENTITY, dahili ENTITIES ürününe diğer nesnelere başvuru verebilir, ancak bu nesneler bunları yalnızca geçici olarak kullanabilir ve başvuruda tutmayabilir. Kök, bir VALUE OBJECT nesnesinin bir kopyasını başka bir nesneye verebilir ve ona ne olduğu önemli değildir, çünkü bu sadece VALUE'dur ve artık AGREGATE ile herhangi bir ilişkisi olmayacaktır.

Bir kök toplamı başka bir kök toplamına bir referans tutarsa, öncekinin sınırı ihlal edilir ve bir toplam kavramı bozuktur, bu yüzden bir kök toplamı başka bir kök toplamına referans tutmaya ihtiyaç duyuyor gibi görünüyorsa, o zaman ihtiyacım var muhtemelen diğer kök varlıklarla aynı üyelerden bazılarını paylaşacak, ancak kitaptaki bu diğer kuralın belirttiği gibi küresel bir kimliği olmayacak farklı bir varlık oluşturmak için :

Kök ENTITIES küresel kimliğe sahiptir. Sınır içerisindeki ENTITIES, sadece AGREGATE içinde benzersiz olan yerel kimliğe sahiptir.

Bunun doğru yol olacağına inanıyorum, ancak tekrarlayan ve gereksiz hissettiği için (DDD bağlamında saf OOP ile çıkarıldığında) biraz geri bildirim istiyorum.


"İç varlık (ayrı bir toplamdaki kök varlık olur)" ile ne demek istiyorsun?
Erik Eidt

2
FWIW, Herhangi bir şey, küresel kimliğe sahip olan şeyler olduğu için, birleşik kök varlık anlamına gelebilir; yönlendirenin kendisinin bir kök varlık olup olmadığı önemsizdir.
Erik Eidt

Erik'in dediği gibi. Ayrıca, modelinizde ID veya referans kullanarak referans almanız da önemli değildir. Her ikisi de DB düzeyinde kimliğe dönüşecek ve bir referansa sahip olmak, ORM'ye varlığı talep üzerine tembel olarak yükleme yeteneği verir.
Euphoric

Yanıtlar:


21

Kitabı fazla yorumluyor olabilirsiniz. Temel olarak şunu söyler: Bir Agrega dışındaki herhangi bir şey, kök dışındaki herhangi bir şeye referans veremez. Bu nedenle, bir köke başvuru yapmak yasaldır. Bir köke referans vermek, kendi topluluğunuzun bir parçası olduğu ve değişmezlerini kontrol edebileceğiniz anlamına gelmez. Kendi değişmezlerini ve özerkliklerini korur.

Ancak,

  • Yaygın olarak kabul edilen iyi bir uygulama , tam referansı değil, kimliğini saklayarak bir AR'ye başvurmaktır.
  • Agrega tasarımına daha modern yaklaşımlar (bkz. Kırmızı Kitap ) Agregalar arasında daha temiz bir ayrımı savunmaktadır. Bir ticari işlem yalnızca tek bir Topluluğun durumunu değiştirmelidir. Bu varsayım altında, aynı anda 2 toplamı değiştirmeyeceğiniz için başka bir Aggregate'e referans depolama ihtiyacı ortadan kalkma eğilimindedir.

bir kök toplamı için ayrı bir toplamda kök varlık olan bir iç varlığa referans olması doğru mudur?

Bu asla olmaz. Bir Değer Nesnesi birden fazla Topluluğun parçası olabilir, ancak bir Varlık olamaz. Bunun nedeni, hiçbir şeyin aynı varlık örneğini Toplamalar arasında paylaşmanızı engellememesidir . Varlık E örneğinin hem A ve B hem de toplu örneklerine ait olduğunu varsayalım. DDD'nin öncüsü, Toplamın giriş noktası olması nedeniyle, A'yı yükleyebilir, E varlıkını değiştirebilir, bu arada değişmezleri sessizce ihlal edebilirsiniz. B (yüklemediğiniz).

Greg Young'ın cevabına buradan bakın: http://domain-driven-design.3010926.n2.nabble.com/Can-an-Entity-be-Shared-across-many-Aggregates-td7579277.html


Guillaume'ye açık, özlü ve anlaşılır cevap için teşekkür ederim. Gerçek DDD uzmanının savoir-faire'ı. Aradığım şey buydu. Chapeau!
Lesair Valmont

Aptalca bir soru olabileceğini biliyorum, Ama holding a referencebu bağlamda ne anlama geldiğini sorabilir miyim ? çünkü bunu söylediğin zaman kafam karıştı: holding a reference to a root is legitbundan sonra dedin ki: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
Bir referans tutun = onu sınıfın bir üyesi olarak dahili / dayanıklı tutun. Buradaki ikilik kökü ve kökü olmayan. Bir kök referansını tutabilir ancak kök olmayan bir referansı tutamazsınız.
guillaume31

@ guillaume31 çok teşekkürler, ama bir idiç varlık (kök değil) başka bir toplam tutmak için iyi olup olmadığını sorabilir miyim veya bu (kök veya değil) ihlal?
Anyname Donotcare

Bu kimlikle ne yapardınız? Depolar bile size sadece kökler verir, iç varlıkları değil.
guillaume31

1

Toplu kök nesneniz (genellikle) yalnızca etki alanının parçası olan özelliklere sahip olmalıdır.

Toplamada olmayan bir özelliğe sahip bir AR nesneniz varsa, hemen soruyla karşı karşıya kalırsınız. 'Neden olmasın?'

Belki de diğer nesnenin kimliğini ekleyebilirsiniz? Veya bir havuz enjekte etmek?

Ancak, hem kök nesnelere hem de gerekli mantığı gerçekleştiren bir etki alanları arası hizmet eklemeniz gerektiği anlaşılıyor


Ewan, iki farklı DDD topluluğuyla biraz iş yapacak bir iş komut dosyası görevi gören bir etki alanı hizmetine sahip olmak yerine, iki farklı toplama arasındaki bir sınıfı OOP açısından yeniden kullanmayı düşünüyordum. Sonuç olarak sizinle aynı fikirdeyim, toplam köküm yalnızca kendi etki alanının parçası olan özelliklere sahip olmalı.
Lesair Valmont
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.