郭宁远,徐建良
(中国海洋大学 信息科学与工程学院,山东 青岛 266100)
摘要:针对财务预算的领域概念和复杂需求,将一种模型驱动的开发方式实践于预算管理系统的设计与实现,使开发人员脱离复杂的数据库设计,更加专注领域概念的消化、模型和数据传输对象的创建。给出了预算管理系统的整体说明和框架的总体结构设计,并以开发顺序依次介绍了各层的设计与实现,最后结合系统快速上线的效果说明了这种模型驱动开发方式的可行性、便利性和快捷性。
关键词:预算管理; 信息系统; Entity Framework; Model First; 数据传输对象; 多层架构; JSON;
中图分类号:TP311.11文献标识码:ADOI: 10.19358/j.issn.16747720.2016.22.003
引用格式:郭宁远,徐建良.模型驱动的预算管理系统设计与实现[J].微型机与应用,2016,35(22):11-14.
0引言
在面对某领域内的专业概念和复杂需求时,将新知识吸收转化为软件产品对于软件开发人员来说是一项艰巨的任务。一方面在此过程中若软件开发人员对领域专家的需求理解不透彻,将会导致工作重心的偏离、软件交付期延长、需求频繁变更等影响软件开发和交付的严重后果。另一方面,软件开发人员更偏向于使用技术来解决领域问题,比如沉溺于设计完美的数据库来满足需求,而这往往是事倍功半的方法。
基于模型的开发方式提高了代码本身的沟通能力。模型是一种知识形式,它对知识进行有选择的简化和有目的的结构化[1]。使用适当的模型并将模型贯穿于整个开发过程,可以使软件开发人员专注于需求相关的信息,简化与领域专家的沟通,使知识表达更加准确,更加贴合需求。
Entity Framework是微软研发的一种对象关系映射组件(ORM),它可以在关系型数据库和对象之间产生自动映射[2]。在Entity Framework 6.x版本中提供三种开发模式:Code First、Database First和Model First[3]。本文将利用Model First开发模式,以模型的构建为中心,通过模型驱动开发,数据库由模型生成,开发人员只需将关注点放在领域模型和数据传输对象(DTO)的转化上即可。
1系统整体说明
1.1系统基本流程
图1预算新建及审核流程系统主要分为两个业务流程,即预算业务流程和预算调整业务流程。
预算业务流程如图1所示,起于专家对已经立项的项目添加预算,终于财务处管理员审核通过预算。
预算调整流程如图2所示,贯穿于整个项目进行过程中,当本次预算出现改变等需要调整的情况时,专家提出调整请求,由科技处管理员审核。
1.2系统模块划分
系统以项目预算业务流程为核心,以数据查询、审核、分析为重心,包括基本信息维护、预算管理、预算调整管理、子课题管理、预算审核管理、调整审核管理、统计报表等功能。系统模块如图3所示。
模块功能简要说明如下:
(1)基本信息维护:包括用户、角色、权限、界面等用户关联信息管理,系统使用基于角色的访问控制方法,可便捷简单地处理用户与权限之间关系;维护批复预算基本增、删、改、查操作。
(2)预算管理:包括专家对负责项目预算信息的基本处理,如新建、修改、查看、保存、提交、报表导出等,以及该项目子课题的科目预算制定与子课题指派等功能。
(3)预算调整管理:预算调整是项目在执行过程中,专家对承担的项目预算进行调整工作,包括调整的新建、修改、查看、保存、提交等工作,在调整过程中,可以添加新的子课题;专家亦可以查阅项目之前的每一次调整。
(4)子课题管理:专家可对子课题凭单号、账本号进行编辑,也可查看参与的项目与子课题的预算分配情况。
(5)预算审核管理:财务处管理员对专家提交的项目预算进行审核。
(6)调整审核管理:科技处管理员对专家提交的预算调整进行审核。
(7)预算数据统计:提供子课题数据的导出功能,将系统中的数据根据财务处相关要求导出一定格式的DBF文件,供财务处统计、分析、导入等使用。
2系统结构设计与各层次的实现
系统采用B/S架构,客户端只需一个浏览器,就可以通过Web服务器与服务器端进行数据交互[4]。按照高效、易维护的原则将系统分为展示层、服务层、数据转化层、业务逻辑层、领域模型层、DTO模型层六个层次,如图4所示。
系统打破传统的以业务逻辑为中心的开发模式,转为以领域模型和DTO模型为中心的开发模式,使前后端开发人员更专注处理用户的需求,更快地理解、吸收领域知识,从而构建高质量、易维护的软件产品。这种开发模式的顺序为:
(1)开发人员与领域专家进行交流沟通,根据需求确定系统的领域模型结构,再根据领域模型构建前后台传输的DTO模型。
(2)确定好领域模型和DTO模型,前端的开发只需关注与后端服务器交互的DTO模型,根据用户对界面的要求和各个界面的DTO模型构建展示层中的各个界面。
(3)后端服务器端只需关注领域模型与DTO模型之间的转化,根据需求的转化规则完成业务逻辑层的编写。
(4)根据前后台约定的数据传输格式,完成数据转化层编写。
(5)编写服务层WebService供前端展示层调用。
开发顺序如图5所示。
2.1领域模型层设计实现
领域模型层是系统的核心层,是连接整个系统的桥梁。在此层次中软件开发人员利用Entity Framework的Model First开发模式构建模型,模式的核心为EDM(Entity Data Model)技术,EDM提供图形化的设计界面,将模型设计和代码实现绑定,通过与领域专家的交流,利用头脑风暴等活动将系统的领域概念和复杂需求等知识消化并提炼到模型当中,并通过不断地修改和调整模型使之更满足预算系统的需求,最终确定出整个系统的领域模型。
确定好领域模型后,开发人员只需保存模型,即可根据模型中属性和实体间关联等信息生成所有实体对象,并生成一个继承于DbContext基类的数据库上下文对象[5]。其中Entity Framework库里面的DbContext基类为操控实体对象执行上下文环境, 提供所需的架构和映射元数据(Meatadata)、数据库链接,同时还包括对象缓存、跟踪状态和关联管理等功能[3]。
保存好模型并生成实体和数据库上下文后,在模型中选择“根据模型生成数据库”,配置好连接字符串,即可从模型映射到相应的数据库中,使开发人员摆脱使用复杂的数据库管理工具进行数据库设计和实现的工作。
以预算及其审核模块为例,构建图6所示模型。
2.2DTO模型层设计实现
领域模型层完成后,开发人员的下一个关注点应是数据的传输,也就是DTO模型的构建。
DTO(Data Transfer Object)即数据传输对象,是一种用来在多层架构软件系统中层间交换数据的对象。DTO的提出是为了在客户端和服务器端交换大量的数据,而无需多个细粒度的调用,从而减少远程调用的数目 ,避免相关的网络负载[6]。
开发人员可根据领域模型和原型界面构建DTO模型。在预算管理系统框架中,业务逻辑层根据每个界面的数据需求从领域模型层中取出相应的数据并组合成与需求数据相对应的DTO对象,然后交由数据转化层;或者由数据转化层将服务层传来的数据转化成DTO对象,然后交由业务逻辑层进行处理。所以,DTO模型是前后台数据传输的核心,确定好DTO模型后,向下关注业务逻辑层的编写,向上关注数据转化层、服务层、展示层的编写,并且可以同时进行,大大节约了时间成本。
以预算审核列表的显示为例,DTO模型的示例代码如下:
public class BudgetAuditListDTO{
public List<BudgetAuditVO> budgetAuditList { get; set; }
}
public class BudgetAuditVO{
public int projectid { get; set; }
public long totalamounts { get; set; }
public long outeramounts { get; set; }
public string prjmanagername { get; set; }
public string prjstate { get; set; }
}
2.3业务逻辑层设计实现
领域模型层和DTO模型层均构建完毕后,业务逻辑层的职责是领域模型和DTO模型之间的转化。语言集成查询(Language Integrated Query,LINQ)是一组语言特性和API,LINQ to Entities提供了查询关系数据库中的实体模型的方式[7]。在此层次中,系统使用LINQ to Entities技术,从领域模型实体中进行数据的增、删、改、查。
以“我的子课题列表”的显示为例,系统在接收到前台的数据请求后,业务逻辑层使用LINQ to Entities技术将数据从数据库中取出。示例代码如下:
varquery = from miss in
database.MissionSet.OfType<InnerMission>()
where miss.ManagerId == userId
select new {
MissionId = miss.Id,
ProjectId = miss.ProjectId,
MissionName = miss.MissionName
};
查询结束后,将结果根据列表所对应的DTO模型进行DTO模型属性的赋值和组合,示例代码如下:
foreach(var q in queryList){
MyMissionListVO mmlVO = new MyMissionListVO(){
missionid = q.MissionId,
projectid = q.ProjectId,
mssname = q.MissionName};
this.missionListDTO.Add(mmlVO);
}
经过上述步骤,业务逻辑层就完成了领域模型与DTO模型的转化。
2.4数据转化层和服务层设计实现
预算管理系统中,前后台数据是通过JSON(JavaScript Object Notation)格式来传输的。JSON是一种轻量级的数据传输格式,易于阅读和编码,可以在多种语言之间进行数据交换[8]。数据转化层将业务逻辑层传来的DTO对象序列化成JSON格式的数据,或者根据服务层传来的JSON格式的数据反序列化成DTO对象。
预算管理系统的数据转化层使用JSON.NET技术实现JSON的序列化和反序列化。使用JSON.NET技术可以自动进行JSON的序列化和反序列化,是.NET框架下一款功能强大且高效的开源序列化和反序列化工具[9]。
以子课题更新功能为例,先将服务层传来的子课题信息反序列化为DTO对象,交由业务逻辑层保存后,将返回的子课题再序列化为JSON返回给服务层。示例代码如下:
MissionDTO missionDTO=
JsonConvert.DeserializeObject<AddAndReturnMissionsBusin-ess>(json);
missionDTO = aarmb.SaveAndReturn(database);
json =
JsonConvert.SerializeObject(missionDTO,Formatting.Indented);
预算管理系统的服务层提供WebService供展示层调用,负责接收展示层发来的请求,并将数据传给数据转化层。
以子课题更新的WebService为例,服务层接收到前端的请求后,实例化数据转化层的对象,将JSON等数据传给数据转化层。示例代码如下:
public class AddAndReturnMissions : WebServiceBase{
[WebMethod]
public void SaveAndReturn(string mssParam){
AddAndReturnMissionsTrans aarmT =
new AddAndReturnMissionsTrans();
aarmT.SaveAndReturn(Database, mssParam);}
}
2.5展示层设计实现
预算管理系统的展示层采用ExtJS富客户端框架。ExtJS是基于JavaScript语言开发的客户端Ajax框架,优点是与后台技术无关,而且浏览器兼容性较强[10]。
在确定完领域模型和DTO模型后,软件的前台开发人员利用ExtJS后台技术无关的优点,并利用之前确定好的DTO模型和需求分析阶段的原型界面即可编写前端代码。
预算管理系统利用ExtJS提供的视图、表单、列表、表格等组件构建友好、美观的用户界面,并通过ExtJS提供的Ajax功能与后台进行交互。以财务处管理员登录后的界面为例,用户登录成功后,系统发起主界面的Ajax请求,取得相应数据并渲染到用户界面。示例界面如图7所示。
3结论
模型驱动的开发方式适用于需求急迫、领域概念复杂、对软件质量要求高的软件研发。本文针对预算管理系统的复杂需求,展示了模型驱动开发方式的实践,软件开发人员使用模型作为一种语言,与领域专家交流并不断改进模型,快速地明确需求,使领域知识精确地消化于模型中。在明确模型之后,以模型为桥梁,使系统框架中各个层次并行开发,大大节约了时间成本。并行的开发使开发人员专注于各层次的功能需求,提高了代码的质量。通过模型,软件开发人员还可以挖掘潜在需求进行深度开发,进一步改进软件的性能。
目前预算系统已上线使用,其在短期内的上线使用和其稳定性证明了文中介绍的基于模型驱动的开发方式的可行性、便利性和快捷性。
参考文献
[1] EVANS E.领域驱动设计[M].赵俐,盛海艳,刘霞,等,译.北京:人民邮电出版社, 2010.
[2] 黄睿.基于Java技术的ORM工具接口的设计与实现[D]. 长春:吉林大学,2012.
[3] 沈霞菲, 王建中.基于.NET Entity Framework数据库访问机制的设计与应用[J].现代电子技术,2014(24):5-8.
[4] 谷惠敏.基于Web的高校档案管理系统设计[J].现代电子技术,2015(21):139-141.
[5] LERMAN J,MILLER R.Programming entity framework: DbContext[M].O’reilly Media,2012.
[6] 朱彬, 陈志军.DTO 模式的研究及对其实现的改进[J].沈阳航空航天大学学报,2004,21(4):53-55.
[7] 郭睿志, 边力, 谭龙丹,等.数据库查询中LINQ to Entities应用研究[J].软件导刊,2014(1):122-124.
[8] 高静, 段会川.JSON数据传输效率研究[J].计算机工程与设计,2011,32(7):2267-2270.
[9] ALLEN J.JsonNET claims significant performance improvements over other.NET Serializers[J].InfoQ,2010.
[10] 易俗, 殷慧文.基于ExtJS的富客户端联通分销商管理系统设计[J].辽宁大学学报(自然科学版),2015,42(2):143-149.