Una radice aggregata può avere più sottotipi

1

Ho un concetto che sto cercando di progettare in modo DDD CQRS e spero di trovare qualche informazione.

Ai vecchi tempi (prima che conoscessi DDD) avrei usato l'ereditarietà semplice, ed è così che la mia mente sta avvolgendo il seguente ...

  • Ho un concetto di dominio: Property
  • C'è un SingleValueProperty che ha un PropertyType e un Value
  • C'è un AttributedProperty che ha una collezione di Attributes

Gli ultimi due sono fondamentalmente lo stesso concetto base in quanto condividono 8 attributi di classe, e userebbero lo stesso Commands e Events da gestire nel dominio. Sono bloccato su come fornirli nel concetto DDD Aggregate Root perché è strano avere il Repository restituire diversi tipi di oggetto.

D'altra parte, ritengo anche che sia ok e segue ancora i principi SOLIDI, poiché questo è ciò che l'ereditarietà è giusta?

Qualcuno ha qualche suggerimento su come modellare questo dilemma?

Modifica:

Voglio aggiungere più contesto in quanto potrebbe influenzare la considerazione.

Viene creato un Property con solo i suoi 8 attributi principali. Successivamente, gli altri aspetti come l'aggiunta di Attributes o la scelta di PropertyType vengono aggiunti a Property . Significa 3 radici aggregate separate?

    
posta designermonkey 16.12.2017 - 23:24
fonte

2 risposte

1

DDD non specifica in realtà come scrivi metodi o classi, quindi non vedo l'ereditarietà come in conflitto con DDD, anche con i Root aggregati.

I root aggregati hanno identità che sono usate per riferirsi ad essi dall'esterno del contesto limitato. Supponendo che l'oggetto dei sottotipi condivida tutti lo stesso spazio di identità (ad esempio, le loro identità sono uniche all'interno, cioè non si sovrappongono). Questo è tutto ciò che è necessario.

A Property is created with only it's main 8 attributes. After that the other aspects like addition of Attributes or choice of PropertyType are added to the Property. Does this mean 3 separate aggregate roots?

Puoi determinare se hai bisogno di più AR se hai concetti separati a cui fare riferimento indipendentemente dal contesto. In questo caso, la domanda a cui devi rispondere è se un Attribute viene aggiunto al sistema e ha un'identità stabile che può essere utilizzata al di fuori del contesto limitato. Se è così, allora è certamente un candidato per essere un altro AR. Se, d'altra parte, questi altri Attribute s sono riferiti (e allegati al Property AR) per il loro valore / nome, allora forse non meritano di essere i loro propri AR.

Mi sembra che tu stia introducendo una complessità inutile classificando separatamente un singolo tipo di proprietà, in particolare b / c non conosci nemmeno il vero tipo fino a quando il (numero di) proprietà è allegato.

C'è un problema che rappresenta tutti i tipi di proprietà come alcuni tipi di proprietà multiple con una collezione che ha zero o più proprietà? Ciò vale anche per la buona domanda che @ConstantinGalbenu chiede in merito al comportamento differenziato. Ora, sicuramente una proprietà senza attributi e con un attributo e più attributi può avere comportamenti diversi, ma in che misura e hai bisogno di ereditarietà per supportare tell che non chiedi consumando i chiamanti.

Non sono sicuro che sia così, anche se la tua domanda suggerisce che le entità possono passare da nessun attributo a singolo attributo a più attributi. Se questo è il caso, l'uso di una gerarchia di classi per questo mi sembra controindicato (ma può ancora essere fatto, per essere sicuro, se si vuole distruggere e ricostruire oggetti di nuovo tipo con la stessa identità). La relazione is-a deve essere stabile e se gli attributi possono venire (e forse andare) che non dovrebbero far parte della relazione is-a - è solo composizione.

Ma torniamo all'aspetto DDD: DDD non richiede AR separati per i sottotipi, in quanto non ci dice come implementare la struttura delle classi. Il concetto AR di DDD si occupa di riferimenti e identità visti dai client esterni al contesto limitato.

    
risposta data 17.12.2017 - 17:52
fonte
0

Non l'ho fatto a livello di radice aggregata, ma ho implementato entità legate a una radice di aggregazione che aveva diversi sottotipi.

In questo caso d'uso specifico avevamo un AR con un insieme di entità Task ad esso legate. Un'attività aveva diversi campi generici, ma a seconda dell'attività potevano avere diversi gestori di comandi. Facendo la sub-tipizzazione per l'entità Task notevolmente semplificata la gestione dei comandi e il processo di sourcing degli eventi delle entità.

Quindi, questa non è una mappatura uno-a-uno con la tua domanda, ma se la si è risolta, suggerirei sicuramente di fare un tentativo anche sul livello Radice Aggregato; almeno lo farei.

Spero che queste informazioni possano aiutarti un po '!

    
risposta data 22.12.2017 - 12:19
fonte

Leggi altre domande sui tag