12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?
王争
该思维导图由 AI 生成,仅供参考
上一节课,我们做了一些理论知识的铺垫性讲解,讲到了两种开发模式,基于贫血模型的传统开发模式,以及基于充血模型的 DDD 开发模式。今天,我们正式进入实战环节,看如何分别用这两种开发模式,设计实现一个钱包系统。
话不多说,让我们正式开始今天的学习吧!
钱包业务背景介绍
很多具有支付、购买功能的应用(比如淘宝、滴滴出行、极客时间等)都支持钱包的功能。应用为每个用户开设一个系统内的虚拟钱包账户,支持用户充值、提现、支付、冻结、透支、转赠、查询账户余额、查询交易流水等操作。下图是一张典型的钱包功能界面,你可以直观地感受一下。
一般来讲,每个虚拟钱包账户都会对应用户的一个真实的支付账户,有可能是银行卡账户,也有可能是三方支付账户(比如支付宝、微信钱包)。为了方便后续的讲解,我们限定钱包暂时只支持充值、提现、支付、查询余额、查询交易流水这五个核心的功能,其他比如冻结、透支、转赠等不常用的功能,我们暂不考虑。为了让你理解这五个核心功能是如何工作的,接下来,我们来一块儿看下它们的业务实现流程。
1. 充值
用户通过三方支付渠道,把自己银行卡账户内的钱,充值到虚拟钱包账号中。这整个过程,我们可以分解为三个主要的操作流程:第一个操作是从用户的银行卡账户转账到应用的公共银行卡账户;第二个操作是将用户的充值金额加到虚拟钱包余额上;第三个操作是记录刚刚这笔交易流水。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了基于充血模型的领域驱动设计(DDD)开发虚拟钱包系统的方法。通过对钱包业务的背景和核心功能的讨论,以及虚拟钱包系统的设计思路和实现细节的详细阐述,读者可以深入了解基于充血模型的DDD开发模式。与传统的基于贫血模型的开发模式相比,本文重点强调了在基于充血模型的开发模式下,Service层的变化和功能。在这种模式下,部分业务逻辑被移动到充血的Domain领域模型中,使得Service类的实现依赖于这个Domain类。同时,文章还讨论了Service层在处理与Repository层的交互、跨领域模型的业务聚合功能和幂等事务等方面的作用。此外,文章还强调了基于充血模型的DDD开发模式下,Controller层和Repository层的代码基本上相同的特点。总的来说,本文通过深入介绍虚拟钱包系统的业务背景、设计思路和两种开发模式的实现,为读者提供了对基于充血模型的DDD开发模式的深入理解和实践指导。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》,新⼈⾸单¥98
《设计模式之美》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(303)
- 最新
- 精选
- miracle建议将完整一些的代码放到 github 上 然后感兴趣的话可以自行去github 上研究或者提 pr
作者回复: 好的,我把完整代码抽空整理好放到github上 https://github.com/wangzheng0822
2019-11-292075 - 邹佳敏看了一圈评论,好像没有人和我有同样的疑惑? 争哥说了很多交易流水表的设计,明明已经详细介绍了字段冗余的表1要明显优于表2,但为何在虚拟钱包的交易流水表的设计里,使用的又是字段紧凑的表2呢? 那么,在底层虚拟钱包的交易流水表里,同样会存在数据不一致的情况呀?A转出被记录下来了,B转入失败。
作者回复: 是有这个问题 我改下
2019-12-021827 - 落叶飞逝的恋还有一点,期待老师实现一个完整的案例的代码以供我们参考琢磨。
作者回复: 完整案例代码可能就太多了
2019-11-29911 - 斜杠青年有一个人问题不太懂 数据持久的话 没有set get方法 如何进行持久化?
作者回复: 如果你用orm框架持久化 必须有get set 那就要妥协
2019-12-1858 - Wiggins老师你好,看完自己实现的时候有个疑问,每次实例化VirtualWallet时候他的balance都会被初始化为0,我又不想把balance set的方法暴露出来,但是如果Domain不跟Repository层交互的话,就无法获取到当前其中的余额。请问下老师是否只能在构造函数中传入这一种办法?
作者回复: 可以放到构造函数中
2019-12-0224 - 饭粒看完这篇对 DDD 也有了初步的认识了,区别了贫血模式的开发,DDD 应用 OOP 的设计实现提高了封装性,在业务对象类 VirtualWallet 中封装数据和基本的数据处理过程,service 使用业务对象类暴露的方法过程以完成完整的功能。实现上业务对象类具备的封装,单一职责等特性,这样在易用,易维护,易扩展,易读等方面较之贫血模型都会有提高。 另外有两个问题请教下老师: 1.贫血模型的 service 中有 VirtualWalletRepository,VirtualWalletTransactionRepository 两个 repository,看字面应该是区分是否带事务,不太明白这样写的好处或用意?因为我现在一般是直接在 service 上直接加事务。 2.钱包交易流水和虚拟钱包的交易流水的功能区分还不是特别清楚,示例代码也没有体现。事物一致性的日子记录不能直接用钱包交易流水线吗?
作者回复: 1、transaction能处理分布式事务 2、再看遍文章吧 都有讲到
2019-12-033 - 晨间新闻看了下项目代码,service里的方法多数都是获取对象列表,对象入库,删除,很多方法都不是具体某个对象的某个动作,不像余额加减一样,是一个动作,对应某个属性的变化。感觉是不是用不上DDD啊。
作者回复: 简单的业务确实用不上ddd
2019-12-033 - 好饿早知道送外卖了对于前端同学而言、DDD是不是类似于MVVM啊?只是没有数据绑定的业务映射
作者回复: 是的
2019-12-022 - JRich老师,上一节不是说业务模型是BO吗,怎么这里又叫domain呢,我们实际开发过程中数据库对象(entity)叫domain,这个该怎么区分呢?
作者回复: 至于叫什么不是关键,关键是理解它是用来做什么的
2020-11-19 - Dana老师里面的代码 不怎么看得懂 没学过 java
作者回复: 应该差不多吧,理解思路是重点
2020-11-13
收起评论