DDD: devono tutte le relazioni del modello Aggregati o possono essere "superficiali"?

3

A volte il mio aggregato sarà molto semplice; alcuni scenari semplicemente non sono abbastanza complessi da richiedere alberi profondi di oggetti e relazioni.

Considera un'applicazione di monitoraggio del sito web, che periodicamente esegue il ping di un URL per verificare se è vivo.

L'app Web avrà:

  • Id
  • FriendlyName
  • URL
  • IsAlive

Non ha molti dati, non ha oggetti figli (eccetto forse che l'URL sia un Oggetto Valore) e sicuramente non avrà molti invarianti - se ce ne sono - per far rispettare entrambi, almeno non in questo momento.

Ora alcuni dicono che poiché non sta modellando un modello più complesso, con relazioni e interni e quant'altro, non è un Aggregato, è solo un'entità.

Il fatto è che non penso che la complessità o le dimensioni debbano essere dettate se si tratta di un oggetto aggregato, entità o valore, ma piuttosto il suo SIGNIFICATO.

Per il dominio di monitoraggio dell'applicazione Web, l'"entità" dell'app Web è il modello radice, è ciò che verrà restituito da un repository. Se l'esperto di domini presenta nuovi requisiti, questi saranno correlati a quel modello di app Web.

Quindi, per quanto mi riguarda, credo che lo renda un WebAppAggregate, piuttosto che una WebAppEntity.

Domanda: la mia linea di pensiero è corretta o ho sbagliato tutto? Grazie in anticipo.

    
posta Levidad 02.01.2018 - 23:38
fonte

2 risposte

6

The thing is, I don't think that complexity or size should be dictating if it's an Aggregate, Entity or Value Object, but rather its MEANING.

Il fatto è che questi termini hanno definizioni enunciate in il libro blu

Dal capitolo cinque. Un modello espresso nel software

Does an object represent something with continuity and identity--something that is tracked through different states or even across different implementations? Or is it an attribute that describes the state of something else? This is the basic distinction between an ENTITY and a VALUE OBJECT.

Dal capitolo Sei. Il ciclo di vita di un oggetto dominio.

AGGREGATES mark off the scope within which invariants have to be maintained at every stage of the life cycle.

An AGGREGATE is a cluster of associated objects that we treat as a unit for the purpose of data changes.

È del tutto coerente avere un aggregato che contiene solo una singola entità, quell'entità che ha solo una singola proprietà interessante e solo i semplici comportamenti che cambiano quella proprietà da un valore all'altro.

I would like to know your thoughts on my solution attempt.

La forma base va bene: la tua entità WebApp è anche la radice dell'aggregato, che è coerente con il modello come descritto da Evans.

Aumentare l'evento di dominio nel costruttore può essere un errore; è certamente un odore di codice (l'innalzamento di un evento di dominio conta certamente come lavoro reale ).

    
risposta data 03.01.2018 - 01:08
fonte
5

The thing is, I don't think that complexity or size should be dictating if it's an Aggregate, Entity or Value Object, but rather its MEANING.

I read someplace you're not supposed to return anything except Aggregates from the Repository.

Sembra che tu stia pensando nei termini in cui un elemento è Aggregato, Entità o Oggetto valore. Tuttavia, la nozione di aggregato non è uguale a entità e valore oggetto; L'aggregazione non è una terza alternativa ma una nozione diversa.

Un aggregato è una raccolta logica di entità (e oggetti valore) e le loro relazioni. Un aggregato ha una singola entità speciale, chiamata entità root. Questa entità root viene definita come radice di aggregazione. È l'unica entità all'interno dell'Agregato a cui è consentito fare riferimento al di fuori di tale aggregato. Come punto di contatto dall'esterno dell'aggregato, generalmente ci si aspetta che la root imponga l'integrità dell'aggregato.

Si noti che la radice di aggregazione è un'entità! L'aggregato stesso è la raccolta logica di entità correlate. È un limite attorno a queste entità (con alcune regole).

Se non hai una collezione, non hai un Aggregate. Ma va bene, hai semplicemente un'entità.

(Secondo me è anche ragionevole pensare a un'entità solitaria che ha un'identità a cui si può riferire, come un caso degenerato di un Aggregato che ha una sola entità, l'entità radice, se preferisci.)

Anche se hai una collezione devi avere almeno una Entità, in questo caso una delle entità deve essere l'entità root, che è la tua Radice Aggregata. Ancora una volta Root aggregato è un'entità mentre un aggregato è una raccolta logica (con una radice di aggregazione).

    
risposta data 03.01.2018 - 01:46
fonte

Leggi altre domande sui tag