Supponiamo di avere un'architettura ispirata a CQRS, con componenti come comandi, modello di dominio, eventi di dominio, DTO modello di lettura.
Ovviamente, possiamo usare Value Objects nel nostro modello di dominio. La mia domanda è, dovrebbero essere utilizzati anche in:Oggetti valore in CQRS - dove usare
- Comandi
- Eventi
- DTOs
non ho visto alcun esempio in cui si utilizzano oggetti di valore (VO) nei componenti menzionato sopra. Invece, vengono usati i tipi primitivi. Forse sono solo gli esempi semplicistici. Dopotutto, la mia comprensione dell'uso di VO in DDD è che agiscono da collante per l'intera applicazione.
La mia motivazione:
Comandi.
Diciamo che l'utente invia un modulo che contiene campi di indirizzi. Abbiamo Object Address Value per rappresentare questo concetto. Quando costruisci il comando nel client, dovremmo comunque validare l'input dell'utente, e quando è ben formato, possiamo creare l'oggetto Address proprio lì e inizializzare Command con esso. Non vedo la necessità di delegare la creazione dell'oggetto Address al gestore comandi.
Eventi di dominio.
Il modello di dominio opera già in termini di oggetti valore, quindi pubblicando eventi con VO anziché convertendoli in tipi primitivi, è possibile evitare alcuni codici di mapping. Sono abbastanza sicuro che sia giusto usare gli OV in questo caso.
DTO.
Se i DTO lato query possono contenere oggetti valore, ciò consente una maggiore flessibilità. Ad esempio, se disponiamo di un oggetto Money, possiamo scegliere se visualizzarlo in EUR o USD, non è necessario modificare il modello di lettura.
Dopo aver riflettuto su questo per un po ', la mia conclusione: avere oggetti ricchi di comportamenti in Eventi è semplicemente impossibile, in quanto devono rappresentare dati storici, e non abbiamo modo di serializzare il comportamento oggi. Per quanto riguarda i comandi e la lettura dei DTO del modello, questo potrebbe funzionare, e non è ancora chiaro se l'accoppiamento che introduce sia accettabile o meno (in ogni caso, si tratta di "se i livelli di dominio e presentazione fanno riferimento alla stessa implementazione di Money VO" piuttosto che "dovrebbe TransferMoneyCommand contenere Money VO o MoneyDTO"). – driushkin