【发布时间】:2015-10-27 16:58:56
【问题描述】:
我正在使用 cqrs 和 ddd 来构建我的应用程序。
我有一个 account 实体、一个 transaction 实体和一个 transactionLine 实体。一个事务包含多个事务行。每个 transactionLine 都有一个金额并指向一个帐户。
如果用户在已经有一个 transactionLine 指向与新 transactionLine 相同的帐户的交易中添加一个 transactionLine,我想简单地将新的 transactionLine 金额添加到现有的一个,防止交易有两个指向同一个帐户的 transactionLines。
例如:
Before command :
transaction
transactionLine1(amount=100, account=2)
transactionLine2(amount=50, account=1)
Command :
addNewTransaction(amount=25, account=1)
Desired result :
transaction
transactionLine1(amount=100, account=2)
transactionLine2(amount=75, account=1) // Add amount (50+25) instead of two different transactionLines
instead of
transaction
transactionLine1(amount=100, account=2)
transactionLine2(amount=50, account=1)
transactionLine3(amount=25, account=1) // Error, two different transactionLines point to the same account
但我想知道最好在命令或事件处理程序中处理这个。
如果这种情况由命令处理程序处理
Before command :
transaction
transactionLine1(amount=100, account=2)
transactionLine2(amount=50, account=1)
Command :
addNewTransaction(amount=25, account=1) // Detects the case
Dispatches event
transactionLineAmountChanged(transactionLine=2, amount=75)
-
收到AddTransactionLine命令
-
检查新transactionLine与同一账户的交易中是否存在transactionLine
-
如果是,则发出 transactionAmountChangedEvt 事件
-
否则,发出一个 transactionAddedEvt 事件
-
相应的事件处理程序处理正确的事件
如果这种情况由事件处理程序处理
Before command :
transaction
transactionLine1(amount=100, account=2)
transactionLine2(amount=50, account=1)
Command :
addNewTransaction(amount=25, account=1)
Dispatches event
transactionLineAdded(transactionLine=3, amount=25)
Handler // Detects the case
transactionLine2.amount = 75
-
收到AddTransactionLine命令
-
TransactionLineAdded 事件被调度
-
TransactionLineAdded 被处理
-
检查添加的交易的transactionLine是否与该账户中现有的transactionLine指向同一个账户
-
如果是这样,只需将新transactionLine的金额添加到现有transactionLine
-
否则,添加新的 transactionLine
【问题讨论】: