Come trasformare un aggregato in un altro in DDD

0

Dove lavoro abbiamo i portafogli con le transazioni (ad esempio ogni transazione appartiene a un singolo portafoglio). Attualmente stiamo lavorando a un'aggiunta di trasferimenti tra portafogli. Come parte di questo, un nuovo concetto di Transfer è stato aggiunto al dizionario di lingua onnipresente.

Un requisito funzionale è dare agli utenti la possibilità di cambiare una transazione in un trasferimento. Poiché una transazione regolare e un trasferimento hanno regole di convalida diverse (come chi può modificare l'aggregato, quali attributi sono modificabili, ...) e poiché i trasferimenti sono un concetto diverso da una transazione, ho creato un aggregato separato per rappresentare un trasferimento.

Ora sto affrontando un problema su come memorizzare i dati. Ho un gestore di comandi con una chiamata a Transaction.changeToTransfer che restituisce un'istanza Transfer . Sto bene con questo approccio, ma dove sono rimasto bloccato era la persistenza.

Dopo aver modificato una transazione in un trasferimento, la transazione regolare originale dovrebbe diventare un trasferimento e non sono sicuro di dove esattamente si suppone che avverrà questa trasformazione.

Una delle idee che mi è venuta in mente non era avere un concetto di trasferimento come un aggregato separato e rappresentare la relazione di trasferimento come valori interni di una transazione regolare, tuttavia non mi piace l'idea di un trasferimento avere accesso ai metodi di una transazione regolare che il trasferimento non dovrebbe avere affatto, quindi perché ho scelto il percorso di avere un aggregato separato.

Un esempio di differenza di comportamento è: un utente può modificare praticamente qualsiasi attributo su una normale transazione, sul trasferimento solo un campo memo può essere modificato e solo dal "proprietario" corrente del trasferimento. Sembra che introdurre controlli su tutti gli altri metodi di aggiornamento che coinvolgono if(isTransfer()) { ... throw ... } sembri sbagliato.

Quale approccio di modellizzazione dovrei affrontare affrontando questo concetto e trasformando un aggregato in un altro?

    
posta Andrew 19.04.2018 - 17:19
fonte

1 risposta

1

Sembra un'eredità nel tuo modello di dominio.

Transfer deriva da Transaction perché è un tipo specifico di Transaction con potenzialmente più informazioni e comportamenti.

La nuova domanda ora è:

Come modellino l'ereditarietà nella mia persistenza?

Ci sono diversi modi per farlo, ma dipenderà dal tipo di database che stai usando.

IIRC, Entity Framework utilizzato per realizzare questo con i database relazionali avendo una tabella per ogni tipo e le tabelle dei tipi derivate chiavi primarie condivise con le tabelle dei tipi di base.

Quindi, nel tuo esempio, avresti una tabella Transaction e una tabella Transfer , e ogni record Transfer avrà un corrispondente Transaction record con una chiave primaria corrispondente.

    
risposta data 19.04.2018 - 20:49
fonte

Leggi altre domande sui tag