Che cos'è una radice aggregata?


447

Sto cercando di capire come utilizzare correttamente il modello di repository. Il concetto centrale di una radice aggregata continua a emergere. Quando cerco sia il Web che Stack Overflow per aiuto su cosa sia una radice aggregata, continuo a trovare discussioni su di essi e collegamenti morti a pagine che dovrebbero contenere definizioni di base.

Nel contesto del modello di repository, che cos'è una radice aggregata?


16
Valuta di rivedere i seguenti casi studio. Progettazione efficace di aggregati Parte I: Modellazione di un singolo aggregato dddcommunity.org/wp-content/uploads/files/pdf_articles/… Parte II: Far lavorare insieme gli aggregati dddcommunity.org/wp-content/uploads/files/pdf_articles/… Parte III: Ottenere approfondimenti attraverso la scoperta dddcommunity.org/wp-content/uploads/files/pdf_articles/…
Ben Vitale,

Risposte:


310

Nel contesto del modello di repository, le radici aggregate sono gli unici oggetti caricati dal codice client dal repository.

Il repository incapsula l'accesso agli oggetti figlio: dal punto di vista di un chiamante li carica automaticamente, contemporaneamente al caricamento della radice o quando sono effettivamente necessari (come nel caso del caricamento lento).

Ad esempio, potresti avere un Orderoggetto che incapsula le operazioni su più LineItemoggetti. Il codice client non caricherà mai gli LineItemoggetti direttamente, ma solo quelli Orderche li contengono, che sarebbe la radice aggregata per quella parte del dominio.


21
Ipoteticamente, se il codice client avesse bisogno di LineItem per qualche altro scopo, ciò costituirebbe un aggregato separato (supponendo che ci sarebbero altri oggetti coinvolti non correlati all'oggetto Order)?
Ahmad,

20
@Ahmad, altri aggregati potrebbero riferirsi a LineItems come dati di sola lettura, semplicemente non possono modificarli . Se altri aggregati potessero modificarli, non potresti proteggere gli invarianti dell'ordine (né gli elementi pubblicitari ').
Jeff Sternal,

4
Dai un'occhiata a questo ad esempio lostechies.com/blogs/jimmy_bogard/archive/2010/02/23/… . Nell'esempio, il cliente è un invariante dell'ordine, giusto? Tuttavia, il cliente può anche essere un'altra radice aggregata? O mi sto perdendo una comprensione fondamentale qui?
Ahmad,

3
@Jeff Hai detto "semplicemente non possono cambiarli" - è applicabile o è una questione di convenzioni?
Neil Barnwell,

4
@Neil: lo imporrei usando qualunque meccanismo di linguaggio sia disponibile, ad esempio creando una classe immutabile per rappresentare i dati.
Jeff Sternal,

206

Da Evans DDD:

Un AGGREGATO è un cluster di oggetti associati che trattiamo come un'unità ai fini della modifica dei dati. Ogni AGGREGATO ha una radice e un confine. Il confine definisce ciò che è all'interno dell'AGGREGATO. La radice è una singola ENTITÀ specifica contenuta nell'AGGREGATO.

E:

Il root è l'unico membro di AGGREGATE a cui gli oggetti esterni possono contenere riferimenti a [.]

Ciò significa che le radici aggregate sono gli unici oggetti che possono essere caricati da un repository.

Un esempio è un modello che contiene Customerun'entità e Addressun'entità. Non potremmo mai accedere a Addressun'entità direttamente dal modello in quanto non ha senso senza il contesto di un associato Customer. Quindi potremmo dire che Customere Addressinsieme formano un aggregato e che Customerè una radice di aggregazione.


57
Aggiornamento da Eric Evans : sottolinea che le radici aggregate sono limiti di coerenza per le transazioni / concorrenza e sottolineano che entità esterne non possono contenere riferimenti a entità figlio di altri aggregati.
Brian Low,

3
Quindi la verbosità mi confonde per sempre. Each AGGREGATE has a roote The root is the only *member* of the AGGREGATE- questo verbale implica che la radice è proprietà sull'aggregato. Ma in tutti gli esempi, è il contrario: la radice contiene proprietà che sono aggregati. Puoi chiarire?
Sinaesthetic,

1
Giusto per capire bene la mia lingua, la Customerclasse è considerata la radice aggregata o le Customer istanze ?
Joe,

1
In generale, nel paradigma dell'elemento pubblicitario dell'ordine cliente, il cliente sarebbe la radice aggregata. L'istanza di un cliente sarebbe un'istanza di tale radice aggregata. Quando si parla di una radice aggregata chiamata cliente, si discute della costruzione logica di un cliente che costituisce l'istanza di un cliente. Una raccolta di clienti è solo una raccolta.
Ibrahim Malluf,

111

La radice aggregata è un nome complesso per un'idea semplice.


Idea generale

Il diagramma di classe ben progettato incapsula i suoi interni. Viene chiamato il punto attraverso il quale si accede a questa struttura aggregate root.

inserisci qui la descrizione dell'immagine

Gli interni della tua soluzione possono essere molto complicati, ma l'utente di questa gerarchia userà semplicemente root.doSomethingWhichHasBusinessMeaning().


Esempio

Controlla questa semplice gerarchia di classi inserisci qui la descrizione dell'immagine

Come vuoi guidare la tua auto? Scegli meglio API

Opzione A (funziona in qualche modo):

car.ride();

Opzione B (l'utente ha accesso agli interni di classe):

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

Se pensi che l'opzione A sia migliore, allora congratulazioni. Hai la ragione principale dietro aggregate root.


La radice aggregata incapsula più classi. puoi manipolare l'intera gerarchia solo attraverso l'oggetto principale.


17
Mi piace l'esempio, ma faccio fatica a trovare uno scenario in cui il Cliente dovrebbe fare riferimento a Engine. Sembra che il motore debba essere incapsulato dietro la macchina. Puoi approfondire un po 'questo?
emragins

A mio avviso, il motore stesso deve trovarsi all'interno di un modello specifico per auto, ad esempio una BMW serie 5 con motore 3000cc. Con questa modellazione il motore è un componente per un'auto.
Parama Dharmika,

1
@ParamaDharmika certo, puoi modellarlo in quel modo. Dipende da quanto "avanzati" con le auto sono i tuoi clienti. Nel modello base dovrebbe avere accesso alla carradice aggregata. Puoi anche consentire una situazione come quella sul disegno. La soluzione corretta dipende dal modello di business dell'applicazione. Potrebbe essere diverso in ciascun caso.
Marcin Szymczak,

1
@MarcinSzymczak corretto, non potrei essere più d'accordo sul fatto che la soluzione dipende dal modello di dominio stesso
Parama Dharmika,

In realtà, la ruota è un aggregato che contiene pneumatici (e altre parti). Se le tue regole richiedono che l'aggregato della ruota sia accessibile solo attraverso l'aggregazione radice auto, allora anche il motore è contenuto nell'aggregazione radice auto e non dovrebbe essere accessibile all'esterno dell'auto. È nel regno di un'istanza Car. Il proprietario di un'auto (cliente) non farebbe riferimento a un motore se non nel contesto della sua auto.
Ibrahim Malluf,

35

Immagina di avere un'entità Computer, anche questa entità non può vivere senza la sua entità Software e Hardware. Questi formano l' Computeraggregato, il mini-ecosistema per la parte del dominio Computer.

Aggregate Root è l'entità madre all'interno dell'aggregato (nel nostro caso Computer), è pratica comune far lavorare il proprio repository solo con le entità che sono Radici aggregate e questa entità è responsabile dell'inizializzazione delle altre entità.

Considerare la radice aggregata come un punto di ingresso a un aggregato.

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

Tieni presente che probabilmente anche l'hardware sarebbe un ValueObject (non ha un'identità propria), consideralo solo come esempio.


6
where T : IAggregateRoot- Questo ha reso la mia giornata
Cristian E.

La formulazione è un po 'contraddittoria, penso e questo è ciò che mi confonde quando provo ad imparare questo. Stai dicendo che il Computer è l'aggregato, ma poi stai dicendo che la radice sarebbe l'entità madre entro l'aggregato. Quindi qual è l'entità "nave madre" all'interno dell'aggregato in questo esempio?
Sinaesthetic

Saluti dal futuro !. Ciò che il ragazzo intende è che il Computer da solo è la radice aggregata, mentre il computer E tutto ciò che contiene è l'aggregato. O più chiaramente: il caso da solo è la radice aggregata, mentre l'intero computer è l'aggregata (la raccolta di tutto ciò che costituisce il "computer, ad esempio illuminazione RGB, hardware, alimentatore, sistema operativo, ecc.)
Capitano Kenpachi

La tecnica IAggregateRoot si presenta nella documentazione di Microsoft: docs.microsoft.com/en-us/dotnet/architecture/microservices/…
Samuel Danielson

16

Se segui un approccio basato sul database, la radice aggregata è in genere la tabella sul lato 1 di una relazione 1-many.

L'esempio più comune è una persona. Ogni persona ha molti indirizzi, una o più buste paga, fatture, voci CRM, ecc. Non è sempre il caso, ma è 9/10 volte.

Attualmente stiamo lavorando su una piattaforma di e-commerce e fondamentalmente abbiamo due radici aggregate:

  1. I clienti
  2. venditori

I clienti forniscono informazioni di contatto, assegniamo loro transazioni, transazioni ottengono elementi pubblicitari, ecc.

I venditori vendono prodotti, hanno persone di contatto, su di noi pagine, offerte speciali, ecc.

Questi sono curati rispettivamente dal repository Cliente e Venditore.


8
Se segui un approccio basato sul database, non stai praticando Domain Driven Design, stai seguendo Data Driven Design.
Sinaesthetic il

5
È un forum di domande e risposte in cui le persone vengono per risolvere problemi e / o apprendere - Non sono stato io a prenderti in giro. Per definizione, DDD è una mentalità più che altro ed è fonte di confusione per molti, quindi sono stato io a assicurarmi che il commento sia stato fatto per coloro che stanno imparando DDD nel tentativo di aiutare a mitigare qualsiasi potenziale conflazione delle metodologie di progettazione.
Sinaesthetic,

12

Dinah:

Nel contesto di un repository, la radice aggregata è un'entità senza entità padre. Contiene zero, una o più entità figlio la cui esistenza dipende dal genitore per la sua identità. Questa è una relazione One to Many in un repository. Tali entità figlio sono aggregati semplici.

inserisci qui la descrizione dell'immagine


1
Quindi, se sei un venditore di auto, allora Auto sarebbe una radice aggregata a sé stante? Perché puoi avere molte auto che non hanno ancora un cliente
JorgeeFG

2
@JorgeeFG la vera risposta è che nessuno ha alcun tipo di indizio. Ci sono così tante informazioni contrastanti sparse in giro.
Mardoxx,

3
Le entità figlio non sono aggregati, sono solo entità che risultano essere membri dell'aggregato in cui la radice aggregata controlla. Un "aggregato" è un raggruppamento logico di entità.
Sinaesthetic il

@JorgeeFG dipende davvero dal contesto limitato che stai progettando. Se sei un venditore di auto, qualcosa come un Carshop diventa la radice aggregata e sotto di essa segue la Cars ...
jokab

8

Da un collegamento interrotto :

All'interno di un aggregato è presente una radice aggregata. La radice aggregata è l'entità padre di tutte le altre entità e oggetti valore all'interno dell'aggregazione.

Un repository opera su una radice aggregata.

Ulteriori informazioni possono essere trovate anche qui .


4
Grazie. Questo è sicuramente il collegamento interrotto più comune e frustrante che ho incontrato continuamente.
Dinah,

Inoltre, la formulazione sembra arretrata. Come può la radice essere all'interno dell'aggregato ed essere allo stesso tempo genitore?
Sinaesthetic,

1
La radice aggregata è la classe principale. Un aggregato semplice è sempre contenuto in una radice aggregata. Usando il diagramma sopra ... Il cliente è la radice aggregata. Il cliente può possedere una o più auto. Le auto sono aggregati in relazione al cliente. Le auto hanno un motore. Il motore è un aggregato contenuto nell'aggregato auto. Ciò che rende il cliente una radice aggregata è l'assunto del modello secondo cui l'accesso a un'automobile o ai suoi componenti avviene sempre attraverso il cliente proprietario dell'auto.
Ibrahim Malluf,

8

Aggregato significa raccolta di qualcosa.
root è come il nodo superiore dell'albero, da cui possiamo accedere a tutto come il <html>nodo nel documento della pagina web.
Blog Analogy, un utente può avere molti post e ogni post può avere molti commenti. quindi se recuperiamo qualsiasi utente, allora può agire come root per accedere a tutti i post correlati e ulteriori commenti di tali post. Si dice che siano tutti insieme raccolti o aggregati


1

Aggregato è dove proteggi i tuoi invarianti e forza la coerenza limitandone l'accesso alla radice aggregata del pensiero. Non dimenticare, l'aggregato dovrebbe progettare in base alle regole e agli invarianti del tuo progetto, non alle relazioni con il database. non si deve iniettare alcun repository e non sono consentite query.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.