Comprendo che DDD sostiene coerenza finale , consentendo così un certo periodo di tempo in cui il sistema potrebbe essere incoerente. Abbracciando la coerenza finale, possiamo quindi modellare i nostri aggregati in modo tale che solo 1 sia aggiornato per transazione.
Tuttavia, la mia domanda è: cosa succede se la relazione tra più aggregati è tale che la coerenza finale non è accettabile o le azioni di compensazione sarebbero troppo complesse da implementare? Ciò significa che DDD non è la scelta giusta in questo scenario, o significa che semplicemente non possiamo usare la regola 1 aggregato per transazione? O forse questo significa che i multipli aggregati devono essere uniti in un aggregato più grande?
Per dare un esempio più concreto, considera quanto segue: Un sistema di aste, composto da Articoli, Aste, Offerte, Utenti e UserBalance. Gli utenti possono fare un'offerta su un'asta se sono soddisfatte le seguenti condizioni:
-
Hanno superato l'attuale offerta più alta, se esistente
-
Il loro saldo ha fondi sufficienti per piazzare l'offerta
Quando un'offerta è superata, l'utente che ha piazzato l'offerta dovrebbe ricevere i fondi utilizzati nel collocare quell'offerta. Gli utenti possono aumentare la loro UserBalance con altre azioni, come acquisti, premi, ecc.
Ho immaginato i seguenti aggregati: asta composta di offerte, utente e utenteBalance.
Imagine Auction ha un metodo chiamato placeBid
che gestisce la logica del posizionamento dell'offerta.
Per preservare la regola 1 aggregato per transazione, l'Asta dovrebbe accettare un oggetto utenteBalance e verificare se il posizionamento dell'offerta è valido. Se sì, procede quindi a creare un'offerta, a impegnare la transazione e pubblicare un evento di dominio. Tuttavia, può accadere che un utente non abbia più fondi sufficienti per pagare un'offerta al momento dell'avvio di BidPlacedHandler. Ciò significa che altri utenti vedranno l'offerta appena posizionata prima che il saldo venga aggiornato. Ciò significa anche che una volta fallito l'aggiornamento di UserBalance, sarà necessario eliminare l'attuale offerta più alta e ripristinare l'offerta precedente come l'offerta più alta, a meno che, naturalmente, non sia stata inserita un'altra offerta nel frattempo.
Mentre la gestione di questi casi compensativi potrebbe essere leggermente illeggibile o difficile da comprendere, la mia più grande preoccupazione è il fatto che gli utenti potrebbero vedere un'offerta non valida come l'offerta più alta per un'asta. Esistono linee guida su come affrontare questo problema, in questo caso particolare o in generale?