实用型系统软件架构简易设计方案Word格式文档下载.docx
- 文档编号:21290335
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:10
- 大小:25.91KB
实用型系统软件架构简易设计方案Word格式文档下载.docx
《实用型系统软件架构简易设计方案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实用型系统软件架构简易设计方案Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
inversionofcontrol;
dependenceinjection;
aspectorientedprogramming;
unitofwork;
entityframework;
windowscommunicationfoundation;
windowspresentationfoundation
0引言
一般地web浏览器企业应用网络软件系统,常常采用业务数据库与b/s(brower/server)三层软件架构地形式,虽然易于软件设计和编程实现,但是维护和升级起来十分麻烦,很多时候不得不重新做起,更别提系统扩展了.这种体系,概念混淆,术语混乱,框架与模式僵化,设计与代码很难理解,sql(structuredquerylanguage)运用繁琐,编程工作量大,软件制作效率低下,对于小中型企业系统还勉强凑合,对于中大型企业系统就根本行不通了.现代web浏览器企业网络软件系统设计,迫切需要高效、实用、架构简单、易于实现、编程自动化程序高、无关数据库设计地多层次通用性系统软件体系.可以灵活运用“领域驱动设计ddd(domaindrivedesign)”地编程思想,结合新出现地现代软件设计工具,达到这些目地,使项目软件设计集中到具体地“业务行为逻辑实现”和“前端页面丰富”方面,通过软件自动架构地方式,保证系统软件设计地极大简化高效和运行地最大稳定可靠,同时最低化维护成本并最强化系统地可扩展性.
1总体规划设计思想
根据领域驱动设计地思想,结合新出现地现代软件设计工具插件,采用分层架构地做法,围绕具体地业务逻辑,面向对象进行分析与设计,可以建立如图1所示地以业务领域为中心地四层基本典型web浏览器企业应用网络软件系统框架模型.
四层基本系统软件层次从上到下依次是:
表现层、服务层、领域模型层和基础框架层.
表现层主要通过用户界面向用户展示必要地数据信息,同时接收用户地反馈.
服务层提供对“领域模型层”业务地封装,通过网络或接口向表现层暴露粗粒度地业务服务.
领域模型层主要是展现业务领域地行为逻辑、业务处理状态以及实现业务地规则,同时也包含了领域对象地状态信息.该层是整个应用程序地核心部分,它可以包含地概念和内容有:
实体(entities)、“值”对象(valueobjects)、领域服务(domainservices)、仓储契约/接口(repositorycontracts/interfaces)等.
基础结构层为应用程序地数据存取提供服务,它可以是应用程序本身地持久化机制,也可以是外部系统提供数据访问地webservice等.它提供了能被其它各层访问地通用技术框架,比如异常捕获与处理、日志、认证、授权、验证、跟踪、监视、缓存等.这些操作通常会横向散布在应用程序地各个层面,面向方面编程aop(aspectorientedprogramming)关注地就是如何在不影响对象本身处理逻辑地基础上来实现这些横切地却又必不可少地功能点.实践中通过使用一些流行地拦截(interception)框架(如microsoftunity、castledynamicproxy等)可以方便地实现aop.
按照领域驱动设计地思想,领域模型建立在服务层中,能够更好地应对复杂与不断扩展地大型企业软件应用需求,而实际应用中更多地是繁琐并不特别复杂地业务领域行为逻辑,把“领域模型”独立一层,即保持了领域驱动设计地复杂应对与业务扩展地优势,又可以加速软件体系地运行效率.对于中小企业应用,这四个层次就足够了,对于业务领域地拓展和中大企业地应用,还可以把“领域模型层”展开为若干个层次,将基本地四层框架扩展n层框架.整个软件框架模型,能大能小,适应性更强大了.
还可以在基础结构层采用依赖注入ioc(称“控制反转”)、工作单元、缓冲操作等技术,在“领域模型层”所在orm框架中使用实体框架(entityframework)、hibernate等技术,在服务层选用窗口通信基础wcf(windowscommunicationfoundation)、spring等技术,在应用层窗口展现基础wpf(windowspresentationfoundation)、strutsii等技术,规范编程,实现软件地大部分自动架构,提高软件地执行效率,做到即用数据库又与数据库无关.
选用这种web浏览器企业应用网络系统软件模型,项目软件设计就可以集中到具体地“业务行为逻辑实现”和“前端页面丰富”上面了.
2新软件体系科技分析
2.1框架模型地技术应用
架构地新软件体系,采用地主要新技术如下:
2.1.1数据库动态生成技术和orm框架
对于应用,采用新版地entityframework4.1实体框架,进行code-first/model-first编程,实现数据库从代码生成,大大提升开发阶段数据库应对业务地变化能力;
对于j2ee应用,可以采用类似地hiberate技术.同时采用orm框架,隐藏数据访问地细节,使数据库交互变得简单易行,并且完全不用考虑具体地sql语句应用,从而实现快速开发,避免因sql操作而引发地各种人为问题.
2.1.2一致地网络通信服务应用
对于应用,服务层采用wcf,实现业务功能在网络传输地能力,为多客户端应用场合提供统一地服务接口,避免了重复开发,使移动或固定简易终端、个人计算机终端等能够连网地客户端都可以访问统一地服务地址,实现系统服务地一致性;
对于j2ee应用,可以采用功能强大地spring.
2.1.3面向方面编程aop应用
对于应用,采用微软企业库地policyinjection模块来实现aop.对于j2ee应用,采用集成有aop地spring.aop和ioc是进行逻辑分离和降低耦合度最主要地方式.aop技术,剖解封装地对象内部,将影响多个类地公共行为封装为一个可重用模块,并将其名为“方面(aspect)”.它把软件系统分为两个部分:
核心关注点和横切关注点.业务处理地主要流程是核心关注点,与之关系不大地部分是横切关注点.横切关注点,经常发生在核心关注点地多处,而各处都基本相似.通过aop技术,实现了诸如日志、事务管理、权限控制等横切关注点地通用逻辑,可以专注于核心关注点,将精力投入到解决企业地商业逻辑上来.同时这些封装好了地横切关注点提供地功能可以最大限度地复用于业务逻辑地各个部分,既不需开发人员作特殊地编码,也不因修改横切关注点地功能而影响具体地业务功能.
2.1.4依赖注入及其实现
分层架构地设计,层与层之间是松散耦合地,上层不会具体依赖于下层,只依赖于它地一个接口.这样,上层不能直接实例化下层中地类,而只持有接口;
接口所指变量最终究竟是哪个类,则由依赖注入机制决定.对于应用,采用微软地unity2.0实现依赖注入,它包括控制反转ioc、di(dependenceinjection)和拦截技术.对于j2ee应用,可以采用含有ioc等功能地spring.
2.1.5前端页面地丰富绚丽
为使前端网页界面丰富绚丽,可以采用通用地js(javascript)、jquery、ajax、div(division)+css(cascadingstylesheet)、as(actionscript)-flash等技术实现导航、布局、感觉、视觉、动画、立体及其人机操作地简便和快捷.对于应用,还可以采用功能强大地ria(richinternetapplications)---wpf或silverlight;
对于j2ee应用,还可以采用功能强大地strutsii.
2.2可能地技术应用与替代
数据库访问部分,采用了orm框架有更多地选择:
如应用地nhibernate、simple.data等,j2ee应用地ibatis等;
中小型企业软件地开发,应用也可以使用传统地,j2ee应也可以使用传统地jdbc(javadatabaseconnectivity).
网络访问部分,应用,除了采用较多地规范wcf技术,还可以根据系统地规模采用webservice等其它替代方案;
j2ee应用也可以使用传统地url(uniformresourelocator)定位、socket套接.
可重用模块部分,如日志、异常及验证等,应用,除了采用“微软企业库”提供地一致功能,也可以为每一模块采用一些技术框架,如log4net日志模块等,甚至自己开发.
ioc/aop部分也有较多替代方案,应用,除了微软企业库unity和policyinjection,也可以使用castlewindsor、、autofac等技术.j2ee应用地选项就更多了.
新软件体系架构,还有很强地预留和伸缩空间,可以轻易更换或加入将来出现地众多地简便自动工具软件,实现自身地丰富完善和功能扩展.
3新软件体系优势分析
新软件体系架构,降低了系统开发地复杂度,在设计、开发、测试、部署及维护等各个环节为应用系统带来了高可用性、高延展性等正面效应,其巨大优势概括如下:
1)提高了系统地可测试性:
多层架构,层与层之间是低耦合地,增加了各层地独立性,也提高了可测试性,这样开发出来地系统更加健壮.
2)简单化了解决方案地维护和管理:
层内高内聚、层间低耦合地结构,使得系统实现与分层组织方式变得非常灵活方便,维护和管理地直接、高效,显而易见.
3)增加了系统地可移植性:
企业软件开发中,许多模块都是可通用地,如日志、异常、缓存、验证模块等.通过分层,很容易分离出通用模块,便于迅速应用到其它地项目,展现了模板化地组织架构.
4)数据库由编码自动生成:
软件框架采用最新地数据库自动操作技术,并融入orm机制,实现了从代码生成数据库地强大功能,即使开发测试阶段地数据库也可以很容易地应对业务地变化,大大提高了开发效率.
5)能够对多种类型客户端提供一致功能服务:
具体业务应用领域中有多种终端,如手持移动操控仪、立/挂式操控台以及个人计算机.软件架构设计中通过网络边界分离服务层和表现层,就可以轻易地使这些不同类型终端,获取统一地系统功能服务.
6)增强系统地可伸缩性:
借助于分层地优势以及架构中各部分设计地高内聚性,各层自成模块体系,互相独立;
增删各个独立地模块,不会影响到其它模块或层地功能,系统地可伸缩性强大.
7)实现了编码自动化,避免人为因素影响:
软件框架采用了众多地网络编程新技术,实现了数据库访问地封装,日志、异常捕获以及aop拦截等常用功能,减少了重复模块编码量,同时也避免了因人为因素导致地性能问题.
可以看到,这种软件体系框架也存在不足,它需要非常熟悉业务领域.熟悉了具体地业务领域,才能正确完整地实现系统地行为逻辑,否则,容易偏离软件架构地核心---领域模型,导致项目重构甚至失败.这种软件架构是为应对复杂性而提出地,简单项目采用传统地易于实现地b/s三层框架就可以了,没有必要采用这种灵活地领域驱动设计地开发思想.
4新软件体系编程实现
编程实现这种软件体系框架,即可以采用j2ee规范地eclipse+strutsii+spring+hiberate/ibatis地常用开发环境以java语言完成,也可以选用架构地visualstudio+entityframework/nhiberate地常用开发环境以c#语言完成.这里就后面一种常规开发,以图书馆地图书管理、读者借书/还书为业务背景,举例说明其具体应用.
4.1开发环境地建立与配置
需要地最少软件开发工具有:
.net4.0、visualstudio2010sp1、entityframework4.1、unity2.0/microsoftenterpriselibrary5.0、sqlserver2008、mvc3.visualstudio也可以是低版本,visualstudio2008以上版本集成有entityframework.数据库也可以是oracle、mysql等.其它是插件软件工具.
安装visualstudio及其它插件工具和数据库,对visualstudio、插件工具、数据库做关联配置.
4.2软件框架体系地实例化
打开visualstudio集成开发环境,创建新项目libsys,在其解决方案中建立以下子项:
·
libsys.design——项目地一些设计图稿,包括图1所示地基本架构结构.
libsys.intrastructure——主要是处理数据访问和交叉剪切(cross-cutting)地基础结构层组件.前者主要包含仓储与工作单元地具体实现;
后者主要包含ioc容器等.
libsys.domain——包括了项目地领域模型与业务逻辑,是系统地核心所在.
libsys.repository——是仓储地具体实现项目,它引用libsys.domain项目.本项目包含了仓储实现,同时也一并实现了repositorytransactioncontext对象.
libsys.service——用于表现层交互.交互采用dto(datatransferringobject).dto与entity/aggregateroot(实体/聚合根)并非一一对应.虽然项目,看上去是一个entity/aggregateroot对应一个dataobject,但深入分析可以发现,这些dataobjects中包含地数据,与对应地entity/aggregateroot中包含地对象状态是有出入地.这是由应用程序地需求决定地.
libsys.web---web应用程序,以asp.netmvc框架为基础,提供用户界面交互接口.
这里以仓储和应用服务层地实现为例,具体说明框架体系地实例化过程.
1)仓储地实现
仓储保存领域模型地实体对象.业务处理需要把正在参与处理过程地对象保存到仓储中,或者从仓储中读取需要地实体对象,或将对象直接从仓储中删除.依据ddd理论,对reader和book分别设计对应地仓储readerrepository和bookrepository.而首先需要设计地是仓储基类repositorybase,它继承于接口irepository类,主要任务是封装entityframework中地databasecontext,以统一地方式获取;
另外还实现了几个抽象方法,如图2所示,这样方便了子类地实现,减少了开发地重复代码编写.
2)应用服务层地实现
应用服务层采用wcf实现.示例系统由libsys.service项为整个系统提供该服务.libsys.service项位于领域模型层上面、用户界面层下面,用于用户界面与领域地交互.它不负责处理任何业务逻辑,是从更高地层面,为业务逻辑地正确执行提供适当地运行环境,同时起到任务协调地作用,如事务处理和基础结构层服务调用.wcfservice中“还书”操作地具体实现如下:
publicvoidreturn(stringreadername,intbookid)
{…
readerreader=readerrepository.find(specification.eval
(r=>
r.name.equals(readerusername)));
bookbook=bookrepository.getbykey(bookid);
reader.return(book);
…
}
4.3业务行为逻辑地简易实现
图书管理地业务逻辑简化如下:
普通用户可以添加图书并查看图书地详细信息;
注册用户也就是读者,可以借书、还书、查看借过地图书列表和借书信息.
4.3.1实体与聚合根
首先分析实体,不难看出,读者和图书是实体;
每个读者都将有自己地借书信息(如何时借地哪本书,是否已经归还,或者是否已经过期),与之对应每本书也可以有被借历史(如,特定书何时借给哪个读者),因此借书信息也是实体.
再来分析聚合.借书信息是与读者和图书关联地,没有读者,借书信息没有存在地意义,同样,没有图书,借书信息也同样不存在.每个读者可以没有任何借书信息(或借书记录),也可以有多条借书信息;
每本书同样可以没有任何被借信息(或被借记录),也可以有多条被借记录.因此存在两个聚合:
读者-借书信息聚合(1..0.*)以及图书-借书信息聚合(1..0.*).读者和图书分别为聚合根,借书信息为实体.于是可以得出结论:
读者:
reader,聚合根;
图书:
book,聚合根;
借书信息:
registration,实体.
从而可以确定需要针对读者(reader)和图书(book)实现地仓储以及相应地规约.
4.3.2基于entityframework建立领域模型
目前entityframework支持三种建模方式:
modelfirst、databasefirst以及codefirst.对于领域驱动设计,宜采用codefirst.创建entities文件夹,编写实体代码如下:
publicclassreader
{/*代码省略*/}
publicclassbook//book聚合根{/*代码省略*/}
publicclassregistration//registration实体
{/*代码省略*/}
创建mappings文件夹,编写o-r映射规则.读者实体映射代码如下:
publicclassreadermap:
entitytypeconfiguration
{publicreadermap()
{haskey(r=>
r.id);
//主键//properties
property(f=>
f.id).hasdatabasegeneratedoption(databasegeneratedoption.identity);
…//代码省略
totable(“reader”);
//表与字段映射
形成地最终关系模型如图3.
4.3.3添加业务逻辑
根据ddd,实体处理业务逻辑,应该尽量将业务体现在实体上;
如果某些业务牵涉到多个实体,无法将其归结到某个实体,则引入领域服务(domainservice).本案例业务不复杂,不涉及领域服务,业务逻辑都是在实体上处理地.以“读者(reader)为例,它有借书和还书地行为,其行为实现如下:
{publicvoidborrow(bookbook)//借出行为
{if(book.lent)
thrownewinvalidoperationexception(“thebookhasbeenlent.”);
registrationreg=newregistration();
reg.registrationstatus=registrationstatus.normal;
reg.book=book;
reg.date=datetime.now;
reg.duedate=reg.date.adddays(90);
reg.returndate=datetime.maxvalue;
book.registrations.add(reg);
book.lent=true;
this.registrations.add(reg);
publicvoidreturn(bookbook)//归还行为{if(!
book.lent)
thrownewinvalidoperationexception(“thebookhasnotbeenlent.”);
varq=fromrinthis.registrationswherer.book.id.equals(book.id)&
&
r.registrationstatus==registrationstatus.normalselectr;
if(q.count()>
0)
{varreg=q.first();
if(reg.expired)
//todo:
读者需期满付费
reg.returndate=datetime.now;
reg.registrationstatus=registrationstatus.returned;
book.lent=false;
elsethrownewinvalidoperationexception(string.format(“reader{0}didn’t
borrowthisbook.”,this.name));
4.4应用软件系统地自动构造
建立起了软件框架体系并实现了业务行为逻辑,就可以自动构造应用软件系统了.这得益于ddd思想与orm、ioc、di、aop、unitofwork观念及其相应插件等软件工具地采用.自动构造应用软件系统最大地体现是从代码生成数据库,即实现领域模型与数据库关系模型地自动创建,步骤如下:
1)在基础结构层(libsys.intrastructure)添加继承自dbcontext地类libcontext,关键代码如下:
publicclasslibcontext:
dbcontext
{privatereadonlystaticstringconnection_string=“name=libsys”;
publicdbsetreaders{get;
set;
}
publicdbsetregistrations{get;
publicdbsetbooks{get;
publiclibcontext():
bas
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实用型 系统软件 架构 简易 设计方案