Ich lese Accounting Pattern und ziemlich neugierig über die Implementierung in CQRS.Wie modellieren Banküberweisung in CQRS
Ich denke AccountingTransaction ein Aggregat Wurzel ist, da es die unveränderliche schützt:
Kein Geld Lecks, sollte es Übertragung von einem Konto auf ein anderes sein.
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,...);
}
}
Wenn die AccountingTransaction zu seinem Repository hinzugefügt wird. Es veröffentlicht mehrere AccountingEntryBookedEvent, die verwendet werden, um den Kontostand der entsprechenden Konten auf der Abfrageseite zu aktualisieren.
Ein Aggregat Stamm aktualisiert pro DB-Transaktion, eventuelle Konsistenz, so weit so gut.
Aber was ist, wenn einige Konten Übertragungsbeschränkungen anwenden, wie z. B. kann die Menge nicht mehr übertragen, die aktuelle Balance? Ich kann die Abfrageseite verwenden, um den Kontostand abzurufen, aber ich mache mir Sorgen, dass Daten von der Abfrageseite veraltet sind.
public class TransferApplication {
public void transfer(...) {
AccountReadModel from = accountQuery.findBy(fromId);
AccountReadModel to = accountQuery.findBy(toId);
if (from.balance() > quantity) {
//create txn
}
}
}
Sollte ich das Konto in der Befehlsseite modellieren? Ich muss mindestens drei Aggregatwurzeln pro DB-Transaktion (von/zu Konto und Konto txn) aktualisieren.
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,...);
}
}
}
Möchten Sie Bankanwendung mit DDD? – Developer
@Singh danke für Ihren Kommentar. Ja, DDD mit CQRS. – Hippoom
Ich habe ein Projekt über Bankapplication. Willst du es? – Developer