摘要:分析了现代企业级的Web应用软件的开发现状,并列举了传统的数据库建模存在的问题,从而引入领域驱动设计(DDD)思想,该思想可以快速对用户需求的变化做出快速反应,能够使领域专家和软件开发工程师有着共同的交流语言,在此思想上给出了一个应用方案,即DDD+REST,并结合ESMISApp应用实例,通过例子中一个简单的功能清晰描述了该方案的思想并完成了领域建模中的分层架构,很好满足了现代企业级应用软件开发需求。
关键词:DDD;REST;HTTP;领域模型;面向对象
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)01-0092-04
目前,Web互联网应用得到了广泛的关注,出现越来越多的应用软件特别是企业级的都在从传统的C/S模式转向B/S模式。基于 Web 的多层架构体系,例如J2EE、ASP.NET、Struts等已经成为解决应用的开发体系。然而以传统的数据库建模为核心的软件开发Web多层架构已经遇到了瓶颈。导致这个瓶颈的根本原因是当时语言本身的缺陷及体系本身需要完善等等,造成ASP.NET(J2EE)等域模型的开发结构一直为贫血模型。
1 数据库建模方法存在的问题
1.1 过程化编程
今天大部分应用层软件都是用面向对象过程开发,但这并不代表使用面向对象语言就可以做到面向对象(OO)开发。实际上以数据库驱动软件开发很容易导致面向过程化设计。因为传统的编程都遵循MVC三层模式的开发,首先确立数据结构,编写大量的存储过程、事物、结构查询语句等都导致无法面向对象,大量的业务逻辑都写在模型层中,而对数据对象并没有任何行为,它只是一种容器,至包含set和get方法,最终导致了面向过程的思想,并没有降低遵循高内聚、低耦合的开发。
1.2 需求分析的反应不够全面
在软件开发的设计中之所以运用到面向对象的思想,是因为它符合人类思考问题的方式,因此采用面向对象数据库是明智的选择,它能使用面向对象的分析方法(OOA)进行需求分析使软件的问题域和解决域在一定层面保持一致。但目前的技术采用面向对象数据库设计还不够很成熟且不是很普及,大部分都是主流的关系型数据库。因此就会导致需求与实现出现脱节的现象,从而延缓了项目开发进度。
1.3 过分依赖数据库
很多开发的软件都过分对数据库的依赖,每次的对业务逻辑操作都是直接调用DAO(Data Access Object)来完成,无形中给数据库造成了相当大的压力,而项目的需求也会不断的在变化,数据库结构则也会一直在改变。过分依赖数据库最终就造成整个系统的不协调,随着系统负载的不断增加,数据库压力越来越大,最终数据库因不堪重负而奔溃。
2 领域驱动设计的方法
自从 2003 年建模专家 Eric Evans 发表
根据Evans提出的领域驱动设计开发理念(如图1所示),领域建模过程大致分为两个步骤:首先是领域模型描述,模型中的领域对象分为实体、工厂、值对象、关联、仓库、聚合、服务类[2];然后对这7类领域分别进行封装和访问权限的管理。
3 基于领域驱动设计的web
3.1 应用软件开发框架REST
为了运用该思想快捷的开发Web应用软件,该文提出一种最新应用方案,即DDD+REST开发,用实际的案例及具体的代码的分析来描述该应用方案是如何运转,从而解决传统架构结构复杂、开发繁琐的缺点。
REST是由Roy Thomas Fielding在其博士学位论文中提出的一种新的基于网络的软件架构风格。针对Web应用的设计和开发方式,可以简化开发的复杂性,增强系统的可伸缩性[3]。REST的统一接口由4个部分组成:资源的标识、通过表述对资源执行的操作、自描述的消息、以及作为应用状态引擎的超媒体[4]。它具有客户端会话无状态、支持多级缓存、客户端和服务器及其中间组件之间使用统一接口、清晰的分层系统、按客户的需求他们可以从服务器下载可执行的代码在客户端运行等优点。
对比REST和HTTP,不难发现两者在诸多方面都十分相似,这也很容易理解,因为大部分B/S架构的web应用软件都是基于HTTP作为传输协议且Roy博士也是HTTP协议的主要创作者之一,所以REST和HTTP有很多的相似之处。
3.2 REST在Web应用的优势
1)REST充分展现了HTTP作为应用层协议的特性,而不必在此基础上添加额外的功能模块,提高了传输运行效率[5]。
2)通常情况下,基于B/S的应用软件不仅仅只有客户端到服务器,他们之间还存在一些中间组件,如网关、路由、代理等构成了一系列的完整通信链路。由于HTTP对中间组件是可见的,所以REST采用HTTP作为通信机制,从而更有利于缓存,提高了服务器的可伸缩性。
3)REST资源本身包含了其它相关资源的链接,因此不需要单独的资源发现机制,减轻了开发成本。
4)由于资源表述形式的多样性,使得REST能更好地与Web2.0的很多前端技术融合。
由上述可知,REST软件架构风格不但能够提高 Web service的运行效率,还可极大地简化互联网应用开发。因此将REST风格应用于实践,具有巨大的现实意义。
4 应用及实现
本文在REST软件架构风格设计的基础上,运用DDD思想在Visual Studio 2010 开发平台下采用C# 语言实现。创建一个名为ESMISApp 的解决方案, 包括八个项目,项目结构见图2。
ESMIS.ddd.business项目定义了整个系统处理的逻辑业务,该层只向外定义它有什么功能,能够做什么,而不做具体的实现。
ESMIS.ddd.domain项目用于定于领域对象,为了能够实现分布式处理,实现客户端远程调用服务,该文在该层定义领域对象(单类、聚类)Datacontract、DataMember等一些WCF的契约。
ESMIS.ddd.repository项目管理实体的集合并封装其持久化过程。这里面说明了资源库管理实体对象的全生命周期。注意对实体对象生命周期管理的很多行为和操作已经不在实体类中,而是在资源库中,资源库转变为一个操作类和类实例化后持久化的一个结合。
ESMIS.ddd.Libs项目主要用于整个解决方案的安全控制和服务路由操作。
ESMIS.rest.IDataServices项目定义了服务契约和操作契约接口,在.NET 4.0 中新增WebGet 和WebInvoke提供对Rest 支持,该文混合采用这两种方式。WebGet属性响应HTTP GET请求,而WebInvoke属性则响应任何HTTP的POST、PUT、DELETE等请求,WebInvoke不仅可读也可写。UriTemplate 是WCF为每种资源以模板的方式定义URI,ResponseFormat定义数据交互的格式,有JSON或XML两种格式,该文主要采用JSON格式。
ESMIS.rest.IWebUIDo项目定义从客户端请求请求资源的URI进行相应的Route Mapping。
ESMIS.rest.ServiceLibs项目主要定义客户端请求URI服务,控制全局restful。
ESMISApp项目主要是一些前台页面的设计,包括图片、CSS、JavaScript、xml、html等文件。
删除功能的运转如图3,其流向图如图4。
本文前台页面采用jquery框架,是一种轻量级的JavaScript库,运用它可以很轻松的实现AJAX。其中ajaxToRest是自定义ajax异步操作函数,url是要传输的目标地址,get传输方式,null代表删除没有数据传输,beforSend_ajax放松以前执行的方法,function是成功以后的回调函数,insertRegisterError_zy是发生错的回调函数,Compeled_ajax是完成后的回调函数。
5 结束语
本文通过对传统基于B/S模式Web应用软件的开发的分析,披露了传统模式开发的各种缺陷及其满足不了客户的需求。在此基础上提出了领域驱动设计思想且嵌入了一种和web应用软件十分契合的REST软件架构风格,通过这两种技术的结合进行软件的设计和实现工作,取得了满意的成果,增强了基于web传输安全性和相应速度。
参考文献:
[1] Eric Evans.领域驱动设计[M].陈大峰,张泽鑫,译.北京:清华大学出版社,2006.
[2] Abel Avran,Floyd Marinescu.领域驱动设计.精简版[EB/OL]. 孙向晖,霍泰稳,译.http://infoq.com/cn/minibooks/domain-driven-desian-quickly.
[3] Roy Fielding. Architectural Styles and the Design of Network-based Software Architectures[D].2000.
[4] Richardson L,Ruby S.RESTful Web Services[M].北京:电子工业出版社,2007:35-37.
[5] Tikov S.回答关于REST的十点疑问[J]. 徐涵,译.程序员,2008(8): 97-99.
[6] 王一宾,李新科.软件体系结构设计方法的研究[J].计算机工程与设计,2005(3).
[7] Martin Fowler.重构——改善既有代码的设计[M].侯捷,熊杰,译.北京:中国电力出版社, 2003.
[8] 彭晨阳.面向对象与领域建模[EB/OL].(2006-12-06)[2007-06-01].http://www.jdon.com/mda/modeling.html.