领域模型(失血,贫血,充血,胀血)
一 mvc架构
先看看MVC三层架构和鲁棒图3元素对应关系。
应用逻辑:如数据有效性验证、授权检查、开始结束事务等。业务逻辑:领域模型
- 服务层需要包含应用逻辑、用户会话的管理,但不能包含领域逻辑、业务逻辑和数据访问逻辑;
- 领域层(领域对象)应该包含业务逻辑,可以处理与业务相关的会话状态.但作为商业应用的核心,应该具有良好的可移植性,不能对特定框架(如Struts、Hibernate、EJB等)产生依赖
二 领域模型
领域模型分为4大类:失血模型、贫血模型、充血模型、胀血模型。想要理解这几个分类,先要知道“血”指的是domain object的model层内容。
1、失血模型
action
service 肿胀的服务逻辑
model:只包含get set方法
dao :数据持久化
业务逻辑和应用逻辑都放到服务层中。这种类在java中叫POJO,在.NET中叫POCO
2、贫血模型
action
service :组合服务 也叫事务服务
model:除包含get set方法,还包含 单服务 又叫原子服务
dao:数据持久化
贫血模型中包含了一些业务逻辑,但不包含依赖持久层的业务逻辑。这部分依赖于持久层的业务逻辑将会放到服务层中。可以看出,贫血模型中的领域对象是不依赖于持久层的
3、充血模型
action
service :组合服务 也叫事务服务
model:get set方法, 单服务 又叫原子服务,含数据持久化的逻辑
充血模型中包含了所有的业务逻辑,包括依赖于持久层的业务逻辑。所以,使用充血模型的领域层是依赖于持久层,简单表示就是UI层->服务层->领域层<->持久层
4、胀血模型
action
model:get set方法, 单服务又叫原子服务 ,数据持久化的逻辑 还包含组合服务,又叫事务服务
胀血模型就是把和业务逻辑不想关的其他应用逻辑(如授权、事务等)都放到领域模型中。我感觉胀血模型反而是另外一种的失血模型,因为服务层消失了,领域层干了服务层的事,到头来还是什么都没变。
一般来说失血模型和胀血模型不常见,贫血模型和充血模型的差别在于,领域模型是否要依赖持久层,贫血模型是不依赖的,而充血模型是依赖的。至于是采用贫血模型还是充血模型,双方争论的焦点是领域模型是否要依赖持久层,因为依赖持久层就意味着单元测试的展开要更加困难(无法脱离框架进行测试,原文的讨论中这里专指Hibernate),领域层就更难独立,将来也更难从应用程序中剥离出来,当然好处是业务逻辑不必混放在不同的层中,使得单一职责性体现的更好。而支持者(充血模型)认为,只要将持久层抽象出来,即可减少测试的困难性,同时适用充血模型毕竟带来了不少开发上的便利性,除了依赖持久层这一点,拥有更多好处的充血模型仍然值得选择。最后,谁也没能说服谁,关于贫血模型和充血模型的选择,更多的要靠具体的业务场景来决定,并不能说哪一种更比哪一种好。设计模式这种东西不是向来都没有什么定论么。
我个人则倾向使用充血模型,因为充血模型更加像一个设计完善的系统架构,好在计算机世界里有很多的IOC和DI框架,唯一的缺陷依赖持久层可以通过各种变通的方法绕过,随着技术的进步,一些缺陷也会被慢慢解决。我的思路是这样的:先将持久层抽象为接口,然后通过服务层将持久层注入到领域模型中,这样领域模型仅仅会依赖于持久层的接口。而这个接口,可以利用现有框架的技术进行抽象。
领域模型(失血,贫血,充血,胀血)相关推荐
- 领域模型的概念:失血 贫血 充血 胀血
转自:http://blog.csdn.net/seakingwy/article/details/4556755,仅供学习 领域模型概念的最合拍的解释: 由此我们终于看出来概念是怎样被偷换的了,一个 ...
- DDD(领域驱动设计)系列主题:失血模型,贫血模型,充血模型和胀血模型详细解读和代码案例说明!
目录 失血模型,贫血模型,充血模型和胀血模型定义及优点和缺点 失血模型 贫血模型 充血模型 胀血模型 失血模型,贫血模型,充血和胀血代码样例 失血模型代码样例 贫血模型代码样例 充血模型代码样例 DD ...
- DDD领域模型、贫血模型、充血模型概念总结
DDD领域模型 领域模型是对领域内的概念类或现实世界中对象的可视化表示.又称概念模型.领域对象模型.分析对象模型.它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系. 业务 ...
- 领域模型、贫血模型、充血模型概念总结
领域模型 领域模型是对领域内的概念类或现实世界中对象的可视化表示.又称概念模型.领域对象模型.分析对象模型.它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系. 业务对象模 ...
- java充血模型orm框架,关于领域驱动设计和贫血、失血、充血模型
大部分应用Spring框架的Java Web应用都相当关注单一职责原则和关注分离原则,但是在此之上却诞生了一些不太好的反模式和设计原则,比如: 领域模型对象只是用来存储应用的数据.(领域模型使用了贫血 ...
- 浅析:领域模型、贫血模型和充血模型
一.领域模型 领域模型是领域内的概念类或现实世界中对象的可视化表示,又称为概念模型或分析对象模型,它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系. 领域模型从业务角色内 ...
- AI检测贫血不看血,竟是看眼睛
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI 不用扎针 ...
- 复合充血模式和领域服务调度-阿里互联网法院项目
在阿里也待啦一段时间,阿里成立啦新的子公司-共道网络科技,公司寄语:公道人,让天下没有难打的官司: 最近在做互联网法院项目:作为一个技术人员我觉得对于公司的技术有必要阐述一下 ,不断的学习和提高自己: ...
- 微服务架构设计基础之领域驱动设计
背景 微服务现在可以说是软件研发领域无人不提的话题,然而业界流行的对比多数都是所谓的Monolithic(单体应用),而大量的系统在十几年前都已经是以SOA(面向服务架构)为基础的分布式系统了,那么微 ...
最新文章
- confluence未授权模板注入/代码执行 cve-2019-3396
- 用一个二维码做下载地址,自动区分是 ios 还是 android
- 数据中心胶体电池的使用寿命
- CSS深入理解学习笔记之z-index
- 【转】strcpy溢出的攻击示例
- 使用Spring Boot进行面向方面的编程
- C++和C语言函数相互调用
- 学习vue.js的自我梳理笔记
- 遇到这个工具前我都是建议文章写好就先投Cell?
- 有关send()和recv()函数的理解
- 计算机对身体有哪些危害,经常玩电脑的危害 经常玩电脑对身体有哪些伤害
- sdut3138: N!(计算n!中结尾零的个数)
- DjVu、PDF中的隐藏文本
- Swift 在UILabel前面或者后面插入图标
- python加载模型包_R中的错误:需要h5py Python包来保存和加载模型
- 高数笔记(十九):对面积的曲面积分,对坐标的曲面积分,高斯公式,斯托克斯公式
- 男人40岁后的健康生活方式
- 期待已久的Apple Tablet PC - iPad 发布了
- VR眼镜连接android设备,如何将VR眼镜的屏幕投影到计算机或电视上?
- 【编译原理】判断文法是几型文法