【发布时间】:2014-06-20 14:56:06
【问题描述】:
我正在阅读Accounting Pattern 并对在 CQRS 中实现它感到非常好奇。
我认为 AccountingTransaction 是一个聚合根,因为它保护不变量:
没有资金外泄,应该从一个账户转移到另一个账户。
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,...);
}
}
AccountingTransaction 添加到其存储库时。它发布了几个AccountingEntryBookedEvent,用于在查询端更新相应账户的余额。
每个数据库事务更新一个聚合根,最终保持一致,到目前为止一切顺利。
但是,如果某些账户应用了转账限制,例如不能转账超过当前余额的数量,该怎么办?我可以使用查询端来获取帐户的余额,但我担心来自查询端的数据是陈旧的。
public class TransferApplication {
public void transfer(...) {
AccountReadModel from = accountQuery.findBy(fromId);
AccountReadModel to = accountQuery.findBy(toId);
if (from.balance() > quantity) {
//create txn
}
}
}
我应该在命令端为帐户建模吗?我必须为每个数据库事务更新至少三个聚合根(来自/到帐户和帐户 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,...);
}
}
}
【问题讨论】:
-
你想要使用 DDD 的银行应用程序吗?
-
@Singh 感谢您的评论。是的,带有 CQRS 的 DDD。
-
我有一个关于 Bankapplication 的项目。你想要吗?
-
@Singh 我想看看,谢谢。如果您方便,可以通过电子邮件(hippoom@gmail.com)发送。
-
@Developer 你的答案在哪里? :(
标签: domain-driven-design cqrs event-sourcing