Co to jest korzeń zagregowany?

447

Próbuję się zastanowić, jak prawidłowo używać wzorca repozytorium. Coraz częściej pojawia się centralna koncepcja Korzenia Kruszywa. Podczas przeszukiwania sieci i przepełnienia stosu w poszukiwaniu pomocy dotyczącej tego, czym jest zagregowany katalog główny, wciąż znajduję dyskusje na ich temat i martwe linki do stron, które powinny zawierać podstawowe definicje.

W kontekście wzorca repozytorium, czym jest zagregowany katalog główny?

Dina
źródło
16
Rozważ przejrzenie poniższych studiów przypadków. Skuteczny projekt agregatów Część I: Modelowanie pojedynczego agregatu dddcommunity.org/wp-content/uploads/files/pdf_articles/… Część II: Tworzenie agregatów współpracuje dddcommunity.org/wp-content/uploads/files/pdf_articles/… Część III: Zdobywanie wiedzy dzięki odkryciu dddcommunity.org/wp-content/uploads/files/pdf_articles/...
Ben Vitale

Odpowiedzi:

310

W kontekście wzorca repozytorium zagregowane katalogi główne są jedynymi obiektami, które kod klienta ładuje z repozytorium.

Repozytorium hermetyzuje dostęp do obiektów potomnych - z perspektywy dzwoniącego automatycznie ładuje je, albo w tym samym czasie, gdy ładowany jest root, albo kiedy są one rzeczywiście potrzebne (jak w przypadku leniwego ładowania).

Na przykład możesz mieć Orderobiekt, który zawiera operacje na wielu LineItemobiektach. Kod klienta nigdy nie ładowałby LineItemobiektów bezpośrednio, tylko ten, Orderktóry je zawiera, co stanowiłoby zagregowany katalog główny dla tej części domeny.

Jeff Sternal
źródło
21
Hipotetycznie, gdyby kod klienta potrzebował elementu LineItem w innym celu, czy tworzyłby on oddzielną agregację (zakładając, że w grę wchodzą inne obiekty niezwiązane z obiektem Order)?
Ahmad
20
@Ahmad, inne agregacje mogą odnosić się do elementów liniowych jako danych tylko do odczytu, po prostu nie mogą ich zmienić . Jeśli inne agregaty mogłyby je zmienić, nie można chronić niezmienników zamówienia (ani elementów zamówienia).
Jeff Sternal
4
Spójrz na to np . Lostechies.com/blogs/jimmy_bogard/archive/2010/02/23/… . W tym przykładzie Klient jest niezmiennikiem Zamówienia, prawda? Jednak klient może być również kolejnym zagregowanym rootem? A może brakuje mi tutaj jakiegoś podstawowego zrozumienia?
Ahmad
3
@Jeff Powiedziałeś „po prostu nie mogą ich zmienić” - czy jest to wykonalne, czy też kwestia konwencji?
Neil Barnwell
4
@ Neil: Egzekwowałbym to przy użyciu wszelkich dostępnych mechanizmów językowych - na przykład poprzez utworzenie niezmiennej klasy do reprezentowania danych.
Jeff Sternal
206

Od Evans DDD:

AGGREGATE to klaster powiązanych obiektów, które traktujemy jako jednostkę do celów zmian danych. Każda AGREGAT ma rdzeń i granicę. Granica określa to, co znajduje się w AGREGACJI. Rdzeń jest pojedynczą, specyficzną ENTITY zawartą w AGGREGATE.

I:

Katalog główny jest jedynym członkiem AGGREGATE, w którym obiekty zewnętrzne mogą przechowywać odniesienia do [.]

Oznacza to, że zagregowane katalogi główne są jedynymi obiektami, które można załadować z repozytorium.

Przykładem jest model zawierający Customerencję i Addressencję. Nigdy nie uzyskalibyśmy dostępu do Addressencji bezpośrednio z modelu, ponieważ nie ma to sensu bez kontekstu powiązanego Customer. Więc można powiedzieć, że Customeri Addressrazem tworzą agregat i że Customerjest agregatem korzeń.

Jason
źródło
57
Aktualizacja Eric Evans : podkreślić, że łączne korzenie są granice konsystencji dla transakcji / współbieżności i deemphasize że podmioty zewnętrzne nie może zawierać odnośniki do innych jednostek podrzędnych kruszywo za.
Brian Low
3
Tak więc verbage zawsze mnie dezorientuje. Each AGGREGATE has a rootoraz The root is the only *member* of the AGGREGATE- ta verbage sugeruje, że root jest własnością Aggregate. Ale we wszystkich przykładach jest odwrotnie: katalog główny zawiera właściwości, które są agregacjami. Możesz wyjaśnić?
Sinaesthetic,
1
Po prostu, aby mój język był właściwy, czy Customerklasa jest uważana za zagregowany katalog główny, czy Customer instancje ?
Joe
1
Ogólnie rzecz biorąc, w paradygmacie „zamówienie-pozycja-element-klient” klient byłby korzeniem zagregowanym. Instancja klienta byłaby instancją tego Agregatu Root. Mówiąc o zagregowanym katalogu głównym zwanym klientem, omawiasz logiczną budowę klienta, który składa się na instancję klienta. Kolekcja Klientów to tylko kolekcja.
Ibrahim Malluf
111

Zagregowany katalog główny to złożona nazwa prostego pomysłu.


Główny pomysł

Dobrze zaprojektowany diagram klas zawiera jego elementy wewnętrzne. Punkt, przez który uzyskujesz dostęp do tej struktury, nazywa się aggregate root.

wprowadź opis zdjęcia tutaj

Elementy wewnętrzne twojego rozwiązania mogą być bardzo skomplikowane, ale użytkownik tej hierarchii po prostu użyje root.doSomethingWhichHasBusinessMeaning().


Przykład

Sprawdź tę prostą hierarchię klas wprowadź opis zdjęcia tutaj

Jak chcesz jeździć samochodem? Wybierz lepsze API

Opcja A (po prostu jakoś działa):

car.ride();

Opcja B (użytkownik ma dostęp do wewnętrznych klas):

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

Jeśli uważasz, że ta opcja A jest lepsza, to gratulacje. Masz główny powód aggregate root.


Agregat root zawiera wiele klas. możesz manipulować całą hierarchią tylko poprzez główny obiekt.

Marcin Szymczak
źródło
17
Podoba mi się ten przykład, ale staram się znaleźć scenariusz, w którym klient powinien odwołać się do silnika. Wygląda na to, że silnik powinien być zamknięty w samochodzie. Czy możesz to trochę rozwinąć?
emragins
Moim zdaniem sam silnik musi znajdować się w modelu samochodu, np. BMW serii 5 z silnikiem o pojemności 3000 cm3. W tym modelowaniu silnik stanowi element samochodu.
Parama Dharmika,
1
@ParamaDharmika na pewno możesz to w ten sposób wymodelować. To zależy od tego, jak zaawansowani w samochodach są twoi klienci. W modelu podstawowym powinien mieć dostęp do carzagregowanego katalogu głównego. Możesz także zezwolić na sytuację taką jak na rysunku. Prawidłowe rozwiązanie zależy od modelu biznesowego aplikacji. W każdym przypadku może być inaczej.
Marcin Szymczak
1
@MarcinSzymczak poprawnie, nie mógł zgodzić się bardziej, że rozwiązanie zależy od samego modelu domeny
Parama Dharmika
W rzeczywistości Koło to agregat zawierający Oponę (i inne części). Jeśli Twoje zasady wymagają, aby dostęp do agregatu Koła był możliwy tylko poprzez Car Root-Aggregate, silnik jest również zawarty w Car Root Aggregate i nie powinien być dostępny poza samochodem. To jest w przypadku instancji Car. Właściciel samochodu (klient) nie odwołuje się do silnika, chyba że w kontekście swojego samochodu.
Ibrahim Malluf,
35

Wyobraź sobie, że masz encję Komputer, ta encja również nie może żyć bez encji Oprogramowanie i encji Sprzęt. Tworzą one Computeragregat, mini ekosystem dla komputerowej części domeny.

Korzeń agregujący jest jednostką macierzystą wewnątrz agregatu (w naszym przypadku Computer), powszechną praktyką jest, aby repozytorium działało tylko z jednostkami będącymi korzeniami agregującymi, a ta jednostka jest odpowiedzialna za inicjowanie innych jednostek.

Rozważ Korzeń agregatu jako punkt wejścia do agregatu.

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

Należy pamiętać, że sprzęt prawdopodobnie byłby również obiektem ValueObject (nie ma własnej tożsamości), należy go traktować jedynie jako przykład.

Francisco Aquino
źródło
6
where T : IAggregateRoot- Ten uczynił mój dzień
Cristian E.
Wydaje mi się, że sformułowanie jest trochę sprzeczne i to mnie dezorientuje, gdy próbuję się tego nauczyć. Mówisz, że Komputer jest agregatem, ale potem mówisz, że root byłby jednostką-matką WEWNĄTRZ agregatu. Który z nich jest jednostką „statku-matki” w tym przykładzie?
Sinaesthetic
Pozdrowienia z przyszłości! Facet ma na myśli to, że Komputer sam w sobie jest zagregowanym korzeniem, podczas gdy komputer ORAZ wszystko w nim jest agregacją. Lub bardziej precyzyjnie: sama sprawa jest zagregowanym korzeniem, podczas gdy cały komputer jest agregatem (zbiór wszystkiego, co składa się na „komputer, np. Oświetlenie RGB, sprzęt, zasilacz, system operacyjny itp.).
Kapitan Kenpachi
Technika IAggregateRoot pojawia się w dokumentacji Microsoft: docs.microsoft.com/en-us/dotnet/architecture/microservices/…
Samuel Danielson
16

Jeśli zastosujesz podejście oparte na pierwszej bazie danych, agregacja katalogu głównego jest zwykle tabelą po 1 stronie relacji 1-many.

Najczęstszym przykładem jest Osoba. Każda osoba ma wiele adresów, co najmniej jeden odcinek wypłaty, faktury, wpisy CRM itp. Nie zawsze tak jest, ale 9/10 razy.

Aktualnie pracujemy na platformie e-commerce i zasadniczo mamy dwa zagregowane źródła:

  1. Klienci
  2. Sprzedawców

Klienci dostarczają dane kontaktowe, przypisujemy do nich transakcje, transakcje otrzymują elementy zamówienia itp.

Sprzedawcy sprzedają produkty, mają osoby kontaktowe, strony o nas, oferty specjalne itp.

Zajmują się nimi odpowiednio repozytorium klienta i sprzedawcy.

Kapitanie Kenpachi
źródło
8
Jeśli zastosujesz podejście oparte na pierwszej bazie danych, nie ćwiczysz projektowania opartego na domenie, postępujesz zgodnie z projektem opartym na danych.
Sinaesthetic
5
To forum pytań i odpowiedzi, na którym ludzie przychodzą, by rozwiązywać problemy i / lub uczyć się - to nie ja narzekałem na ciebie. Z definicji DDD jest nastawieniem bardziej niż cokolwiek innego i jest mylące dla wielu, więc to ja upewniłem się, że komentarz został napisany dla tych, którzy uczą się DDD, aby pomóc złagodzić potencjalne połączenie metod projektowania.
Sinaesthetic
12

Dinah:

W kontekście repozytorium zagregowany katalog główny jest bytem bez bytu nadrzędnego. Zawiera zero, jeden lub wiele bytów potomnych, których istnienie jest zależne od rodzica pod względem tożsamości. To relacja jeden do wielu w repozytorium. Te byty potomne są zwykłymi agregatami.

wprowadź opis zdjęcia tutaj

Ibrahim Malluf
źródło
1
Tak więc, jeśli jesteś sprzedawcą samochodów, to Car byłby kruszywem samym w sobie? Ponieważ możesz mieć wiele samochodów, które nie mają jeszcze klienta
JorgeeFG
2
@JorgeeFG prawdziwa odpowiedź brzmi: nikt nie ma żadnego pojęcia. Wokół jest tyle sprzecznych informacji.
Mardoxx,
3
Podmioty potomne nie są agregatami, są tylko bytami, które są członkami agregatu, w którym kontrolowany jest agregat root. „Agregacja” to logiczna grupa podmiotów.
Sinaesthetic
@JorgeeFG to naprawdę zależy od ograniczonego kontekstu, który projektujesz. Jeśli jesteś sprzedawcą samochodu, to coś jak Carshop staje łączna korzeń, a poniżej wynika Cars ...
jokab
8

Z niedziałającego linku :

W obrębie agregatu znajduje się korzeń agregatu. Korzeń agregacji jest jednostką nadrzędną dla wszystkich innych jednostek i obiektów wartości w agregacie.

Repozytorium działa na Root Aggregate.

Więcej informacji można również znaleźć tutaj .

Otávio Décio
źródło
4
Dziękuję Ci. To zdecydowanie najczęstsze i frustrujące zerwane łącze, na które ciągle natrafiłem.
Dinah
Również sformułowanie wydaje się odwrócone. Jak może być korzeń wewnątrz na aggreate i czy to rodzic w tym samym czasie?
Sinaesthetic,
1
Korzeń agregujący jest klasą główną. Zwykły agregat jest zawsze zawarty w katalogu głównym agregatu. Korzystanie ze schematu przedstawionego powyżej ... Klient jest korzeniem zagregowanym. Klient może posiadać jeden lub więcej samochodów. Samochody są agregatami w stosunku do klienta. Samochody mają silnik. Silnik to agregat zawarty w agregacie samochodowym. To, co sprawia, że ​​klient jest łącznym korzeniem, to założenie modelu, że dostęp do samochodu lub jego części jest zawsze dokonywany przez klienta, który jest właścicielem samochodu.
Ibrahim Malluf,
8

Agregat oznacza zbiór czegoś.
root jest jak górny węzeł drzewa, z którego możemy uzyskać dostęp do wszystkiego, jak <html>węzeł w dokumencie strony internetowej.
Blog Analogia, użytkownik może mieć wiele postów, a każdy post może mieć wiele komentarzy. więc jeśli ściągniemy dowolnego użytkownika, może on działać jako root, aby uzyskać dostęp do wszystkich powiązanych postów i dalszych komentarzy do tych postów. Wszystko to razem określa się jako zbiór lub agregację

palash140
źródło
1

Agregat to miejsce, w którym chronisz niezmienniki i wymuszasz spójność, ograniczając dostęp do głównego źródła danych. Nie zapominaj, że agregacja powinna projektować według reguł biznesowych i niezmienników projektu, a nie relacji do bazy danych. nie powinieneś wstrzykiwać żadnego repozytorium i żadne zapytania nie są dozwolone.

Alireza Rahmani Khalili
źródło