本文转载自:http://hi.baidu.com/infol/blog/item/c4c5e1504c9b406f84352400.html。由于对方的博客不支持直接转载,因此我复制过来了。转载请注明原始作者是:http://hi.baidu.com/infol/blog/item/c4c5e1504c9b406f84352400.html
Martin Fowler很早以前就写过一篇文章,题目叫"贫血模型"。文章里面批判贫血的领域模型是不够优雅、不够OO的,提倡使用充血的领域模型。在Java世界 里这是一直争论的话题。到底什么是贫血什么是充血呢?
贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。
优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Business Logic->Data Access(ADO.NET)。当然Business Logic是依赖Domain Object的。似乎现在流行的架构就是这样,当然层次还可以细分。
该模型的缺点是不够面向对象,领域对象只是作为保存状态或者传递状态使用,所以就说只有数据没有行为的对象不是真正的对象。在Business Logic里面处理所有的业务逻辑,在POEAA(企业应用架构模式)一书中被称为Transaction Script模式。
充血模型:层次结构和上面的差不多,不过大多业务逻辑和持久化放在Domain Object里面,Business Logic只是简单封装部分业务逻辑以及控制事务、权限等,这样层次结构就变成Client->(Business Facade)->Business Logic->Domain Object->Data Access。
它的优点是面向对象,Business Logic符合单一职责,不像在贫血模型里面 那样包含所有的业务逻辑太过沉重。
缺点是如何划分业务逻辑,什么样的逻辑应该放在Domain Object中,什么样的业务逻辑应该放在Business Logic中,这是很含糊的。即使划分好了业务逻辑,由于分散在Business Logic和Domain Object层中,不能更好的分模块开发。熟悉业务逻辑的开发人员需要渗透到Domain Logic中去,而在Domian Logic又包含了持久化,对于开发者来说这十分混乱。 其次,因为Business Logic要控制事务并且为上层提供一个统一的服务调用入口点,它就必须把在Domain Logic里实现的业务逻辑全部重新包装一遍,完全属于重复劳动。
如果技术能够支持充血模型,那当然是最完美的解决方案。不过现在的.NET框架并没有ORM工具(不算上开源的NHibernate,Castle之 类),没有ORM就没有透明的持久化支持,在Domain Object层会对Data Access层构成依赖,如果脱离了Data Access层,Domain Object的业务逻辑就无法进行单元测试,这也是很致命的。如果有像Spring的动态注入和Hibernate的透明持久化支持,那么充血模型还是能 够实现的。
选择了.NET平台开发,就是选择了开发高效、功能强大应用简单,最适合的模型就是贫血模型,或表数据入口,既有编译器和语 言平台很好的支持,也符合微软提倡的开发模式。如果跟潮流在项目中使用充血模型,现有的ORM工具都很复杂难用,光是维护大量的映射文件都成问题。说贫血 不够OO,它的Domain Object不够丰富,能把项目做好了,有一定的扩展能力和伸缩行就行了,也 不一定要讲究优雅的面向对象。正如SOA,讲究松耦合、高内聚,服务端给客户 端提供的服务,也就是一系列的方法调用加上DTO而已,不管服务的内部是不是面向对象的实现,至少它暴露出 来的是过程式的服务。
这些只是我一直以来看到网上的讨论结合开发项目的体会,一家之言,希望大家能说说自己的观点^_^ 。
PS: 现在虽然有Linq,但是它毕竟只是集成查询的语言,Linq to SQL离ORM还有一段距离,听说ADO.NET Entity Framework将会完美支持领域驱动设计,那也只有明年再看了。
分享到:
相关推荐
本文解释了当今比较新的设计模式中的贫血和充血模式。对加深理解二模型很有帮助!
失血模型简单来说,就是domain object只有属性的getter/setter方法的纯数据类,所有的业务逻辑完全由business object来完成(又称TransactionScript),这种模型下的domain object被Martin Fowler称之为“贫血的domain...
贫血模式下的SSH处理日志管理以及对权限管理的思考。在众多情况下,日志的管理是通过拦截器来完成的,不过通过STRUTS2的拦截器编码比较繁琐,在此通过spring的aop来处理,在贫血模式下将代码量降到最低,同时配置...
背景:小细胞性低铬性贫血的最常见原因是铁缺乏性贫血(IDA)和β-地中海贫血特征(β-TT)。 这项工作的目的是比较各种简单指标的有效性,以区分铁缺乏性贫血和β-地中海贫血性状。 对象和方法:通过全血筛查,血清...
未确诊的PPH和产后贫血增加了社区晚期孕妇死亡的风险。 这项研究的目的是评估在资源匮乏的情况下贫血的患病率,隐匿的产后早期出血以及产后贫血的严重程度。 方法:这是一项纵向研究。 我们包括孕妇参加分娩。 入院...
缺铁性贫血病历模板.doc
简介:在地中海贫血中反复输血和肠道铁吸收增加会导致铁超负荷,各种活性氧的催化产生会触发氧化应激。 内皮作为暴露于活性氧中的第一个器官,由于内皮功能障碍会触发高凝作用,其粘附分子会显着增加。 目的:探讨铁...
贫血模型or领域模型的举例对比,让你初步了解贫血模型与领域模型的区别和概念
该贫血大多数为中度(92.2%),且具有铁缺乏模式(48%)。 在一半的受试者中观察到低白蛋白血症,并且似乎与贫血的严重程度相关。 令人惊讶地,如CRP所反映的,炎症的严重程度与贫血成反比。 在多变量分析中,...
背景:本研究旨在确定在Volta地区医院实验室进行的全血细胞计数(FBC)调查的5岁以下儿童的贫血患病率和形态类型。 方法:这是一项对2015年7月1日至12月31日之间实验室中5岁以下儿童档案FBC测试结果数据的回顾性研究...
这是一项横断面描述性研究,旨在确定Duffy-46C / C镰状细胞性贫血中的HIV血清阳性率,该研究于2015年至2016年在金沙萨圣克里斯平的Yolo Sud SS联合医学中心和卢本巴希的Jason Sendwe医院进行。通过免疫层析测试确定...
背景:尼日利亚为全球镰状细胞性贫血负担贡献了30%。 胆石症通常发生在镰状细胞性贫血儿童中,可能仍未被诊断,模仿腹部血管闭塞性危机或因结石性胆囊炎而变得复杂。 早期识别患有胆石症的镰状细胞性贫血儿童可减少...
我们报告了严重的血清阴性重症肌无力和Biermer贫血(或恶性贫血)的关联。 一名31岁的塞内加尔患者在我们科住院之前12个月因维生素B12缺乏性贫血而被随访。 尽管纠正了与上睑下垂相关的贫血,但她仍被认为具有强烈的...
血液透析患者贫血的管理.ppt
血管闭塞性危象是镰状细胞性贫血患儿的常见临床表现,通常需要在住院期间进行静脉输液,止痛药治疗,有时还需抗疟疾和抗生素治疗。 疼痛是血管闭塞性危机的主要症状,可影响身体的任何部位。 喷他佐辛是一种众所周知...
老年人中的贫血与临床表现有关,例如功能依赖性,认知能力低下,死亡率增加和老年综合症(痴呆,del妄,抑郁和跌倒)。 最近的研究表明,低血红蛋白水平,肌肉力量下降和身体健康之间存在关联。 这项审查的目的是在...
肉苁蓉多糖对骨髓抑制性贫血小鼠造血调控的实验研究,陈志伟,祝彼得,目的:观察肉苁蓉多糖对骨髓抑制贫血小鼠造血功能的影响,探讨其造血调控作用机制。方法:采用CO60照射和注射环磷酰胺复合制备贫血�
益中生血胶囊治疗肿瘤相关性贫血的临床观察,侯丽,倪磊,目的:观察益中生血胶囊治疗肿瘤相关性贫血的临床疗效。方法:根据临床研究方案,共收集有效病例46例,根据性别、原发部位、TNM分�
再生障碍性贫血教学查房.ppt