Я использую cqrs и ddd для создания моего приложения.Логика домена в обработчике команд или обработчике событий?
У меня есть объект учета, объект транзакции и объект transactionLine. Транзакция содержит несколько транзакций. Каждая транзакцияLine имеет сумму и указывает на учетную запись.
Если пользователь добавляет транзакционную транзакцию в транзакцию, которая уже имеет транзакционную линию, которая указывает на ту же учетную запись, что и новая транзакционная строка, я хочу просто добавить новую сумму транзакции в существующую, предотвращая транзакцию от две транзакции, которые указывают на одну учетную запись.
Ex:
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 с той же учетной записью
Если это так, испустите транзакцию событиеAmountChangedEvt
В противном случае, испускает событие 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
В противном случае, добавьте новую транзакциюНапряжение