首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们是否应该因为边缘情况而使聚合根复杂化?

我们是否应该因为边缘情况而使聚合根复杂化?
EN

Stack Overflow用户
提问于 2019-09-06 20:25:10
回答 1查看 60关注 0票数 0

假设我们正在实现一个使用事件源的支付系统,并拥有PaymentCreated、PaymentAuthorized、PaymentSettled和PaymentInvoiced等事件

很明显,支付应该是我们的聚合根,所有的操作都发生在它上面。

但也有退款。退款基本上是一种付款,唯一的区别是它的金额是负的,它必须引用我们正在退款的付款。在所有其他方面,它的行为都像正常支付一样。它具有相同的状态和事件集,所有外部系统都以与正常支付相同的方式处理退款。

更有趣的是,可以有多个部分退款,但退款金额的总和必须小于或等于原始付款金额。

我们基本上有两个选项来实现它。

a)作为聚合根的付款-缺点是,当检查退款限制时,我们必须锁定付款,我们正在退款并检查其他退款。换句话说,退款初始化使用多个聚合根进行操作,这是不推荐的。

b)“支付组”作为聚合根-我们可以将原始支付及其所有退款放在一个聚合中,该聚合可以强制执行不变量。缺点是,系统中的大多数操作都是在一个付款/退款级别上执行的,因此模型与用例不匹配。假设第三方通知我们付款/退款已结清。我们得到一个外部ID,我们必须通过这个ID找到支付组,并在那里找到付款(使用相同的ID)。这似乎不必要地使大部分代码复杂化,只是为了确保退款中的一个不变量。

你有什么推荐的?

EN

回答 1

Stack Overflow用户

发布于 2019-09-11 07:06:55

amount.

  • Refunds validation.

  • There
  1. 您有一个业务约束,即退款金额不能低于原始付款可能会部分发生,因此每个交易都必须经历此过程中可能会有多个退款,因此您需要确保退款检查和处理作为一个事务处理的一部分发生。

因此,您的退款和付款是同一事务一致性边界的一部分。应该有一个聚合,Payment,并且您的Refund必须是它的一部分。所有退款交易都必须通过Payment聚合进行路由。

在DDD术语中,Refund是属于Payment聚合的域模型中的一个实体。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57822011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档