什么是贫血模型?什么是充血模型?
什么是 MVC 三层架构
其中 M 表示 Model,V 表示 View,C 表示 Controller。MVC 会将整个项目分为三层:展示层、逻辑层和数据层。但是在实际开发中并不一定会遵从这种固定的分层,如:
在前后端分离项目中,后端往往分为:Repository、Service 和 Controller 三层,其中 Repository 负责与数据库交互进行数据访问,Service 负责业务逻辑,Controller 负责向前端暴露接口。而在 SpringMVC 的那一套中,Controller 层我们往往会返回一个 Model(视图对象),即它代表展示层。
什么是贫血模型
以 MVC 三层架构为例,开发中我们经常定义 Entity <–> Repository,VO <–> Controller,BO <–> Service,这样数据与业务逻辑分离的操作,是典型的面向过程编程,而其中的 BO 这样只有数据没有业务逻辑的类就被称作贫血模型
什么是基于充血模型的DDD开发模式
什么是充血模型
与贫血模型正相反,它将数据和业务逻辑封装在一个类中,这个类就被称作充血模型
什么是领域驱动设计(DDD)
除了监控、调用链追踪、API网关等服务治理系统的开发之外,微服务还有另外一个更加重要的工作,那就是针对公司的业务,合理地做微服务拆分。而领域驱动设计恰好就是用来指导划分服务的。
做好领域驱动设计的关键是:看你对自己所做业务的熟悉程度,而并不是对领域驱动设计这个概念本身的掌握程度。
基于充血模型的 DDD 开发模式与基于贫血模型的 MVC 的区别
开发模式相同都是基于三层架构,主要区别在于 Service 层,基于贫血模型的传统的开发模式,重 Service 轻 BO;基于充血模型的 DDD 开发模式,轻 Service重 Domain。而 Domain 就是数据和业务类型封装在一起的类
为什么说基于贫血模型的传统开发模式违反OOP?
数据和业务逻辑分离,违反了 OOP 的封装特性,数据能够被外界随意修改,同时业务逻辑往往基于 SQL,难以复用
两者的开发流程有何不同
基于充血模型的 DDD 开发模式 前期做大量的业务调研、领域模型设计(可复用的业务中间件),后期根据领域模型完成新功能需求的开发
基于贫血模型的 MVC 开发模式 根据需求抽象 Entity 对象,每个 Entity 对应数据库中的一张表 –> 根据业务需求编写 SQL –> 按照 SQL 模板式的往 Repository、Service 和 Controller 中填充代码
什么情况下我们应该考虑使用基于充血模型的DDD开发模式?
越复杂的系统,对代码的复用性和易维护性要求越高,就越需要花精力和时间在前期的设计上,而基于充血模型的DDD开发模式正好适合。
实战-虚拟钱包
需求分析
虚拟钱包的充值、提现和支付实际上就是真实账户的转账操作
DDD开发模型图
从上图总结 Domain 的特性:
- Domain 作为一个领域驱动模型,它不与 Service 和 Repository 进行耦合,因此可以方便的复用
- Service 通过组合和委托通过 Domain 完成业务逻辑,通过 Repository 完成数据交换