Sto leggendo Accounting Pattern e sono piuttosto curioso di implementarlo in CQRS.Come modellare il bonifico bancario in CQRS
Penso AccountingTransaction è una radice aggregata in quanto protegge l'invariante:
Nessuna perdita di denaro, che dovrebbe essere il trasferimento da un conto ad un altro.
public class AccountingTransaction {
private String sequence;
private AccountId from;
private AccountId to;
private MonetaryAmount quantity;
private DateTime whenCharged;
public AccountingTransaction(...) {
raise(new AccountingEntryBookedEvent(sequence, from, quantity.negate(),...);
raise(new AccountingEntryBookedEvent(sequence, to, quantity,...);
}
}
Quando l'AccountingTransaction viene aggiunto al suo repository. Pubblica diversi AccountingEntryBookedEvent che vengono utilizzati per aggiornare il saldo degli account corrispondenti sul lato query.
Una radice aggregata aggiornata per transazione db, consistenza finale, finora così buona.
Ma se alcuni account applicano vincoli di trasferimento, come ad esempio non è possibile trasferire quantità più del saldo corrente? Posso utilizzare il lato query per ottenere il saldo dell'account, ma sono preoccupato che i dati dal lato query siano obsoleti.
public class TransferApplication {
public void transfer(...) {
AccountReadModel from = accountQuery.findBy(fromId);
AccountReadModel to = accountQuery.findBy(toId);
if (from.balance() > quantity) {
//create txn
}
}
}
Devo modellare l'account dal lato comandi? Devo aggiornare almeno tre root aggregati per transazione db (da/a account e account txn).
public class TransferApplication {
public void transfer(...) {
Account from = accountRepository.findBy(fromId);
Account to = accountRepository.findBy(toId);
Transaction txn = new Transaction(from, to, quantity);
//unit or work locks and updates all three aggregates
}
}
public class AccountingTransaction {
public AccountingTransaction(...) {
if (from.permit(quantity) {
from.debit(quantity);
to.credit(quantity);
raise(new TransactionCreatedEvent(sequence, from, to, quantity,...);
}
}
}
Vuoi un'applicazione con bank utilizzando DDD? – Developer
@Singh grazie per il tuo commento. Sì, DDD con CQRS. – Hippoom
Ho un progetto su Bankapplication. Lo vuoi? – Developer