MCV三层框架中
M表示Model(数据层),
V表示View(展示层),
C表示Controller(逻辑层)。
但在实际项目中会有所适当调整,
后端项目分为
Respository层(负责数据访问,由Entity和Respository类构成),
Service层(负责业务逻辑,由Bo和Service类构成),
Controller层(负责暴露接口,由Vo和Controller类构成)。
贫血模式是数据和业务逻辑相分离,是面向过程的编程风格,不符合面对对象的封装特性。
比如Service层的数据和业务逻辑,被分离在BO和Service两个类中。
像BO这样,只包含数据,不包含业务逻辑的类,就叫贫血模型。同理,Entity和VO类也是一样。
充血模式指数据和业务逻辑相结合,一起被封装在同一个类中。
DDD开发模式也是按照传统MVC架构分层的,也是Respository层,Service层,Controller层。
但基于充血的DDD开发模式中,Serivce层由Service类和Domain类两部分构成,Domain类不仅包含数据,还包含业务逻辑,而Serive类就变得轻薄。
DDD(Domain Drive Design)领域驱动设计,核心思想是解耦与内聚,建立领域模型聚合根,将部分原来在Service层的业务逻辑移动到充血的Domain领域模型内,让Service类的实现依赖这个Domain类。
比如,在钱包业务中,WalletService类的充值方法逻辑:第一步,从数据层查询钱包实体信息;第二步,钱包的余额加上充值金额 ;第三步,数据层保存最新钱包金额。
如果转换为充血的DDD开发模式,则创建一个WalletDomain钱包领域类,将第二步的业务逻辑封装为WalletDomain类里的方法。
在基于充血的DDD开发模式下,Service类并不会完全移除,而是负责一些不适合放在Domain类中的功能。
比如,负责与Respository层打交道,跨领域模型的业务聚合功能,幂等事务等非功能性的工作。
基于充血的DDD开发模式跟基于贫血的MVC开发模式相比,Controller层和Respository层的代码基本上相同。
这是因为,Respository层的Entity生命周期有限,Controller层的VO只是单纯作为一种DTO。
两种开发模式的区别在于Service层,
基于贫血模式的MVC开发模式,重Service轻BO;
而基于充血模型的DDD开发模式,轻Serivie重Domain。
1、业务系统比较简单
2、充血模型更难
3、思维固化,转换成本
对于复杂业务系统的开发来说,基于贫血的开发模式会让代码越来越混乱,最终导致无法维护。
复杂系统对代码的复用性,易维护性要求高,需要前期大量设计。
而基于充血模型的DDD开发模式,也正好需要前期大量的业务调研,设计领域模型,充当可复用的业务中间层。后期新功能需求的开发,也都基于之前定义好的这些领域模式来完成。
因此,基于充血的DDD开发模式,更适合业务复杂的系统开发。比如,包含各种利息计算模型,还款模型等复杂业务的金融系统等。
而基于贫血的MVC开发模式比较适合简单的系统开发。