Come fa un repository a cancellare oggetti valore rimossi dal DB senza ORM?

1

Diciamo che Entity è composto da più ValueObjects . Ad esempio, un vagabondo potrebbe lasciare qualche impronta alle spalle.

ImmaginadicaricareWandererdaunrepositoryedeliminaretuttiipassianorddelconfinecanadese.PoichéFootstepèunoggettovaloresenzaidentità(ID),inchemodoilrepositorydovrebbesaperequalidevonoessereeliminatineldatabase?Dovrebbecancellaretuttoeriscriveresoloquellitenutidall'oggettodominiocheglièstatodato?

Allostessomodo,consideraMilestoneschecontienepiùIssueschepuòessereapertoochiuso.DovreiessereingradodimodificarequalsiasistatodiIssueindipendentementedalfattochesiaraggruppatodaMilestoneomeno.

Tuttavia, se chiudo un Issue , il progresso verso il Milestone (definito come il rapporto tra chiuso e totale Issues contenuto) cambia, e così pure la rappresentazione del Milestone che I ' mi piace aggiornare per riflettere i nuovi progressi. Gli eventi di dominio entrano in gioco qui?

Come si dovrebbe gestire tali casi nel contesto di DDD?

    
posta Double M 19.10.2018 - 15:05
fonte

1 risposta

0

Per il tuo primo caso, devi semplicemente riformulare "cancella tutti i passi a nord del confine canadese" per "eliminare tutti i passi dove y > latitude of border " o qualcosa di leggermente più sofisticato. In che modo un ID per ogni Footstep può anche aiutare con il processo sopra riportato? Sei ancora lasciato a capire quali ID corrispondono a un passo a nord del confine.

Per il tuo secondo caso, un Issue non si chiude da solo. Milestone funge da aggregato per un gruppo di Issue . Come tale ogni Milestone chiude (e apre) i propri problemi. Questo ha senso in termini di flusso comunque? Milestone.OpenIssue sembra essere il modo più indicativo per creare un nuovo Issue . In termini di spazio di archiviazione, anziché la tua tabella "Issue" con una sorta di campo [status] (che indica "OPEN", "CLOSED", "PENDING", ecc.), Dovresti invece memorizzare [status] su una tabella di join tra "Milestone" e "Issue" .

Affettare i dati verticalmente come questo è una tattica estremamente potente e importante quando si modella un dominio. È importante identificare il tuo sistema in termini di comportamento , non solo di dati. In questo caso abbiamo scoperto, attraverso una conoscenza minima del crunch, che un Issue non ha una proprietà status !

Gli eventi di dominio sono i più utilizzati per gestire il processo, non per sincronizzare lo stato (ad esempio% evento diUserCreated è gestito dal tuo EmailService per inviare un messaggio di benvenuto). Una volta che inizierai a cercare di gestire / sincronizzare lo stato con gli eventi, il tuo sistema diventerà inevitabilmente piuttosto complesso e difficile da comprendere. Lo scopo di DDD è creare sistemi facili da modificare e un sistema che non può essere compreso non può essere modificato.

Quanto sopra non è una regola . Naturalmente ci possono essere situazioni in cui si desidera mantenere lo stato sincronizzato (ad esempio mantenendo aggiornati i modelli di lettura denormalizzati), ma provare il meglio in assoluto per evitare questo tipo di ginnastica nel modello di scrittura e cercare sempre strategie alternative.

    
risposta data 19.10.2018 - 18:11
fonte

Leggi altre domande sui tag