美文网首页
领域驱动的失血模型、缺血模型、充血模型、胀血模型对比分析

领域驱动的失血模型、缺血模型、充血模型、胀血模型对比分析

作者: 两颗酸橙子 | 来源:发表于2020-12-29 15:09 被阅读0次

1、失血模型

失血模型中,domain object只有属性的get set方法的纯数据类,所有的业务逻辑完全由Service层来完成的,由于没有dao,Service直接操作数据库,进行数据持久化。

service:  肿胀的服务逻辑

model:只包含get set方法

显然失血模型service层负担太重,一般不会有这种设计。

2、贫血模型

贫血模型中,domain ojbect包含了不依赖于持久化的原子领域逻辑,而组合逻辑在Service层。

service :组合服务,也叫事务服务

model:除包含get set方法,还包含原子服务(如获得关联model的id)

dao:数据持久化

贫血模型比较常见,其问题在于原子服务往往不能直接拿到关联model,因此可以把这个原子服务变成直接用关联modelRepo拿到关联model,这就是充血模型。

3、充血模型

充血模型中,绝大多业务逻辑都应该被放在domain object里面,包括持久化逻辑,而Service层是很薄的一层,仅仅封装事务和少量逻辑,不和DAO层打交道。

service :组合服务 也叫事务服务

model:除包含get set方法,还包含原子服务和数据持久化的逻辑

充血模型的问题也很明显,当model中包含了数据持久化的逻辑,实例化的时候可能会有很大麻烦,拿到了太多不一定需要的关联model。

4、胀血模型

胀血模型取消了Service层,只剩下domain object和DAO两层,在domain object的domain logic上面封装事务。

一般来说失血模型和胀血模型不常见,多采用贫血模型。

贫血模型和充血模型的差别在于,领域模型是否要依赖持久层,贫血模型是不依赖的,而充血模型是依赖的。

血模型概述

失血模型模型仅仅包含数据的定义和getter/setter方法,业务逻辑和应用逻辑都放到服务层中,这种类在java中叫POJO,在.Net 中叫POCO

贫血模型贫血模型中包含了一些业务逻辑,但不包含依赖持久层的业务逻辑。这部分依赖于持久层的业务逻辑将会放到服务层中。可以看出,贫血模型中的领域对象是不依赖于持久层的。

充血模型充血模型中包含了所有的业务逻辑,包含依赖于持久层的业务逻辑。所以,使用充血模型的领域层是依赖于持久层,简单表示就是UI层—》服务层

——〉领域层——》持久层

胀血模型胀血模型就是把和业务逻辑不想关的其他应用逻辑(如授权,事务等)都放到领域模型中,我感觉胀血模型反而是另一种的失血模型,因为服务层消失了,领域层干了服务层的事,到头了还是什么都没变。

特点对比分析

关于一个模型的相关处理逻辑如下:

1.成员的set/get

2.对数据加工的逻辑,相比于set/get更复杂的逻辑

3.关于数据的处理

4.对表示层的响应

补充说明:

通常的3层架构,表示层,业务层,数据层。表示层和数据层都好理解,就是把数据加工层模型表示,或者通过表示层的数据加工成模型,并保存。这里的关键是对模型的加工有两种加工,简单加工,复杂加工。简单加工就是set/get复杂加工就是指更复杂的加工逻辑,关于以上的4中*血模型,处理差别的关键就在于对复杂处理逻辑的处理放置的位置。

相关文章

网友评论

      本文标题:领域驱动的失血模型、缺血模型、充血模型、胀血模型对比分析

      本文链接:https://www.haomeiwen.com/subject/dknfoktx.html