设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?

Controller层和Repository层的设计
Service类的职责
VirtualWalletService
VirtualWallet
VirtualWalletService
VirtualWalletController
Web后端项目的三层结构
虚拟钱包系统与三方支付系统
查询交易流水
查询余额
提现
支付
充值
课堂讨论
重点回顾
辩证思考与灵活应用
基于充血模型的DDD开发模式
基于贫血模型的传统开发模式
钱包系统的设计思路
钱包业务背景介绍
如何利用基于充血模型的DDD开发一个虚拟钱包系统

该思维导图由 AI 生成,仅供参考

上一节课,我们做了一些理论知识的铺垫性讲解,讲到了两种开发模式,基于贫血模型的传统开发模式,以及基于充血模型的 DDD 开发模式。今天,我们正式进入实战环节,看如何分别用这两种开发模式,设计实现一个钱包系统。
话不多说,让我们正式开始今天的学习吧!

钱包业务背景介绍

很多具有支付、购买功能的应用(比如淘宝、滴滴出行、极客时间等)都支持钱包的功能。应用为每个用户开设一个系统内的虚拟钱包账户,支持用户充值、提现、支付、冻结、透支、转赠、查询账户余额、查询交易流水等操作。下图是一张典型的钱包功能界面,你可以直观地感受一下。
一般来讲,每个虚拟钱包账户都会对应用户的一个真实的支付账户,有可能是银行卡账户,也有可能是三方支付账户(比如支付宝、微信钱包)。为了方便后续的讲解,我们限定钱包暂时只支持充值、提现、支付、查询余额、查询交易流水这五个核心的功能,其他比如冻结、透支、转赠等不常用的功能,我们暂不考虑。为了让你理解这五个核心功能是如何工作的,接下来,我们来一块儿看下它们的业务实现流程。

1. 充值

用户通过三方支付渠道,把自己银行卡账户内的钱,充值到虚拟钱包账号中。这整个过程,我们可以分解为三个主要的操作流程:第一个操作是从用户的银行卡账户转账到应用的公共银行卡账户;第二个操作是将用户的充值金额加到虚拟钱包余额上;第三个操作是记录刚刚这笔交易流水。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了基于充血模型的领域驱动设计(DDD)开发虚拟钱包系统的方法。通过对钱包业务的背景和核心功能的讨论,以及虚拟钱包系统的设计思路和实现细节的详细阐述,读者可以深入了解基于充血模型的DDD开发模式。与传统的基于贫血模型的开发模式相比,本文重点强调了在基于充血模型的开发模式下,Service层的变化和功能。在这种模式下,部分业务逻辑被移动到充血的Domain领域模型中,使得Service类的实现依赖于这个Domain类。同时,文章还讨论了Service层在处理与Repository层的交互、跨领域模型的业务聚合功能和幂等事务等方面的作用。此外,文章还强调了基于充血模型的DDD开发模式下,Controller层和Repository层的代码基本上相同的特点。总的来说,本文通过深入介绍虚拟钱包系统的业务背景、设计思路和两种开发模式的实现,为读者提供了对基于充血模型的DDD开发模式的深入理解和实践指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(303)

  • 最新
  • 精选
  • miracle
    建议将完整一些的代码放到 github 上 然后感兴趣的话可以自行去github 上研究或者提 pr

    作者回复: 好的,我把完整代码抽空整理好放到github上 https://github.com/wangzheng0822

    2019-11-29
    20
    75
  • 邹佳敏
    看了一圈评论,好像没有人和我有同样的疑惑? 争哥说了很多交易流水表的设计,明明已经详细介绍了字段冗余的表1要明显优于表2,但为何在虚拟钱包的交易流水表的设计里,使用的又是字段紧凑的表2呢? 那么,在底层虚拟钱包的交易流水表里,同样会存在数据不一致的情况呀?A转出被记录下来了,B转入失败。

    作者回复: 是有这个问题 我改下

    2019-12-02
    18
    27
  • 落叶飞逝的恋
    还有一点,期待老师实现一个完整的案例的代码以供我们参考琢磨。

    作者回复: 完整案例代码可能就太多了

    2019-11-29
    9
    11
  • 斜杠青年
    有一个人问题不太懂 数据持久的话 没有set get方法 如何进行持久化?

    作者回复: 如果你用orm框架持久化 必须有get set 那就要妥协

    2019-12-18
    5
    8
  • Wiggins
    老师你好,看完自己实现的时候有个疑问,每次实例化VirtualWallet时候他的balance都会被初始化为0,我又不想把balance set的方法暴露出来,但是如果Domain不跟Repository层交互的话,就无法获取到当前其中的余额。请问下老师是否只能在构造函数中传入这一种办法?

    作者回复: 可以放到构造函数中

    2019-12-02
    2
    4
  • 饭粒
    看完这篇对 DDD 也有了初步的认识了,区别了贫血模式的开发,DDD 应用 OOP 的设计实现提高了封装性,在业务对象类 VirtualWallet 中封装数据和基本的数据处理过程,service 使用业务对象类暴露的方法过程以完成完整的功能。实现上业务对象类具备的封装,单一职责等特性,这样在易用,易维护,易扩展,易读等方面较之贫血模型都会有提高。 另外有两个问题请教下老师: 1.贫血模型的 service 中有 VirtualWalletRepository,VirtualWalletTransactionRepository 两个 repository,看字面应该是区分是否带事务,不太明白这样写的好处或用意?因为我现在一般是直接在 service 上直接加事务。 2.钱包交易流水和虚拟钱包的交易流水的功能区分还不是特别清楚,示例代码也没有体现。事物一致性的日子记录不能直接用钱包交易流水线吗?

    作者回复: 1、transaction能处理分布式事务 2、再看遍文章吧 都有讲到

    2019-12-03
    3
  • 晨间新闻
    看了下项目代码,service里的方法多数都是获取对象列表,对象入库,删除,很多方法都不是具体某个对象的某个动作,不像余额加减一样,是一个动作,对应某个属性的变化。感觉是不是用不上DDD啊。

    作者回复: 简单的业务确实用不上ddd

    2019-12-03
    3
  • 好饿早知道送外卖了
    对于前端同学而言、DDD是不是类似于MVVM啊?只是没有数据绑定的业务映射

    作者回复: 是的

    2019-12-02
    2
  • JRich
    老师,上一节不是说业务模型是BO吗,怎么这里又叫domain呢,我们实际开发过程中数据库对象(entity)叫domain,这个该怎么区分呢?

    作者回复: 至于叫什么不是关键,关键是理解它是用来做什么的

    2020-11-19
  • Dana
    老师里面的代码 不怎么看得懂 没学过 java

    作者回复: 应该差不多吧,理解思路是重点

    2020-11-13
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部