gpt4 book ai didi

domain-driven-design - 命令处理程序或事件处理程序中的域逻辑?

转载 作者:行者123 更新时间:2023-12-03 23:23:52 26 4
gpt4 key购买 nike

我正在使用 cqrs 和 ddd 来构建我的应用程序。
我有一个帐户实体、一个交易实体和一个 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
  • 最佳答案

    命令和事件都不应该包含域逻辑,只有域应该包含域逻辑。在您的域中,聚合根代表事务边界(不是您的事务实体,而是逻辑的事务)。处理命令或事件中的逻辑将绕过这些边界并使您的系统非常脆弱。

    该逻辑的正确位置是事务实体。

    所以最好的方法是

    AddTransactionCommand finds the correct transaction entity and calls
    Transaction.AddLine(...), which does the logic and publishes events of what happened
    TransactionLineAddedEvent or TransactionLineChangedEvent depending on what happened.

    关于domain-driven-design - 命令处理程序或事件处理程序中的域逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33374038/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com