郭寧遠,徐建良
(中國海洋大學 信息科學與工程學院,山東 青島 266100)
模型驅動的預算管理系統設計與實現
郭寧遠,徐建良
(中國海洋大學 信息科學與工程學院,山東 青島 266100)
針對財務預算的領域概念和復雜需求,將一種模型驅動的開發方式實踐于預算管理系統的設計與實現,使開發人員脫離復雜的數據庫設計,更加專注領域概念的消化、模型和數據傳輸對象的創建。給出了預算管理系統的整體說明和框架的總體結構設計,并以開發順序依次介紹了各層的設計與實現,最后結合系統快速上線的效果說明了這種模型驅動開發方式的可行性、便利性和快捷性。
預算管理; 信息系統;EntityFramework;ModelFirst; 數據傳輸對象; 多層架構;JSON;
在面對某領域內的專業概念和復雜需求時,將新知識吸收轉化為軟件產品對于軟件開發人員來說是一項艱巨的任務。一方面在此過程中若軟件開發人員對領域專家的需求理解不透徹,將會導致工作重心的偏離、軟件交付期延長、需求頻繁變更等影響軟件開發和交付的嚴重后果。另一方面,軟件開發人員更偏向于使用技術來解決領域問題,比如沉溺于設計完美的數據庫來滿足需求,而這往往是事倍功半的方法。
基于模型的開發方式提高了代碼本身的溝通能力。模型是一種知識形式,它對知識進行有選擇的簡化和有目的的結構化[1]。使用適當的模型并將模型貫穿于整個開發過程,可以使軟件開發人員專注于需求相關的信息,簡化與領域專家的溝通,使知識表達更加準確,更加貼合需求。
EntityFramework是微軟研發的一種對象關系映射組件(ORM),它可以在關系型數據庫和對象之間產生自動映射[2]。在EntityFramework6.x版本中提供三種開發模式:CodeFirst、DatabaseFirst和ModelFirst[3]。本文將利用ModelFirst開發模式,以模型的構建為中心,通過模型驅動開發,數據庫由模型生成,開發人員只需將關注點放在領域模型和數據傳輸對象(DTO)的轉化上即可。
1.1 系統基本流程

圖1 預算新建及審核流程
系統主要分為兩個業務流程,即預算業務流程和預算調整業務流程。
預算業務流程如圖1所示,起于專家對已經立項的項目添加預算,終于財務處管理員審核通過預算。
預算調整流程如圖2所示,貫穿于整個項目進行過程中,當本次預算出現改變等需要調整的情況時,專家提出調整請求,由科技處管理員審核。

圖2 預算調整新建及審核流程
1.2 系統模塊劃分
系統以項目預算業務流程為核心,以數據查詢、審核、分析為重心,包括基本信息維護、預算管理、預算調整管理、子課題管理、預算審核管理、調整審核管理、統計報表等功能。系統模塊如圖3所示。

圖3 模塊劃分圖
模塊功能簡要說明如下:
(1)基本信息維護:包括用戶、角色、權限、界面等用戶關聯信息管理,系統使用基于角色的訪問控制方法,可便捷簡單地處理用戶與權限之間關系;維護批復預算基本增、刪、改、查操作。
(2)預算管理:包括專家對負責項目預算信息的基本處理,如新建、修改、查看、保存、提交、報表導出等,以及該項目子課題的科目預算制定與子課題指派等功能。
(3)預算調整管理:預算調整是項目在執行過程中,專家對承擔的項目預算進行調整工作,包括調整的新建、修改、查看、保存、提交等工作,在調整過程中,可以添加新的子課題;專家亦可以查閱項目之前的每一次調整。
(4)子課題管理:專家可對子課題憑單號、賬本號進行編輯,也可查看參與的項目與子課題的預算分配情況。
(5)預算審核管理:財務處管理員對專家提交的項目預算進行審核。
(6)調整審核管理:科技處管理員對專家提交的預算調整進行審核。
(7)預算數據統計:提供子課題數據的導出功能,將系統中的數據根據財務處相關要求導出一定格式的DBF文件,供財務處統計、分析、導入等使用。
系統采用B/S架構,客戶端只需一個瀏覽器,就可以通過Web服務器與服務器端進行數據交互[4]。按照高效、易維護的原則將系統分為展示層、服務層、數據轉化層、業務邏輯層、領域模型層、DTO模型層六個層次,如圖4所示。

圖4 系統結構圖
系統打破傳統的以業務邏輯為中心的開發模式,轉為以領域模型和DTO模型為中心的開發模式,使前后端開發人員更專注處理用戶的需求,更快地理解、吸收領域知識,從而構建高質量、易維護的軟件產品。這種開發模式的順序為:
(1)開發人員與領域專家進行交流溝通,根據需求確定系統的領域模型結構,再根據領域模型構建前后臺傳輸的DTO模型。
(2)確定好領域模型和DTO模型,前端的開發只需關注與后端服務器交互的DTO模型,根據用戶對界面的要求和各個界面的DTO模型構建展示層中的各個界面。
(3)后端服務器端只需關注領域模型與DTO模型之間的轉化,根據需求的轉化規則完成業務邏輯層的編寫。
(4)根據前后臺約定的數據傳輸格式,完成數據轉化層編寫。
(5)編寫服務層WebService供前端展示層調用。
開發順序如圖5所示。

圖5 開發順序圖
2.1 領域模型層設計實現
領域模型層是系統的核心層,是連接整個系統的橋梁。在此層次中軟件開發人員利用EntityFramework的ModelFirst開發模式構建模型,模式的核心為EDM(EntityDataModel)技術,EDM提供圖形化的設計界面,將模型設計和代碼實現綁定,通過與領域專家的交流,利用頭腦風暴等活動將系統的領域概念和復雜需求等知識消化并提煉到模型當中,并通過不斷地修改和調整模型使之更滿足預算系統的需求,最終確定出整個系統的領域模型。
確定好領域模型后,開發人員只需保存模型,即可根據模型中屬性和實體間關聯等信息生成所有實體對象,并生成一個繼承于DbContext基類的數據庫上下文對象[5]。其中EntityFramework庫里面的DbContext基類為操控實體對象執行上下文環境, 提供所需的架構和映射元數據(Meatadata)、數據庫鏈接,同時還包括對象緩存、跟蹤狀態和關聯管理等功能[3]。
保存好模型并生成實體和數據庫上下文后,在模型中選擇“根據模型生成數據庫”,配置好連接字符串,即可從模型映射到相應的數據庫中,使開發人員擺脫使用復雜的數據庫管理工具進行數據庫設計和實現的工作。
以預算及其審核模塊為例,構建圖6所示模型。

圖6 預算及審核模型圖
2.2DTO模型層設計實現
領域模型層完成后,開發人員的下一個關注點應是數據的傳輸,也就是DTO模型的構建。
DTO(DataTransferObject)即數據傳輸對象,是一種用來在多層架構軟件系統中層間交換數據的對象。DTO的提出是為了在客戶端和服務器端交換大量的數據,而無需多個細粒度的調用,從而減少遠程調用的數目 ,避免相關的網絡負載[6]。
開發人員可根據領域模型和原型界面構建DTO模型。在預算管理系統框架中,業務邏輯層根據每個界面的數據需求從領域模型層中取出相應的數據并組合成與需求數據相對應的DTO對象,然后交由數據轉化層;或者由數據轉化層將服務層傳來的數據轉化成DTO對象,然后交由業務邏輯層進行處理。所以,DTO模型是前后臺數據傳輸的核心,確定好DTO模型后,向下關注業務邏輯層的編寫,向上關注數據轉化層、服務層、展示層的編寫,并且可以同時進行,大大節約了時間成本。
以預算審核列表的顯示為例,DTO模型的示例代碼如下:
publicclassBudgetAuditListDTO{
publicList
}
publicclassBudgetAuditVO{
publicintprojectid{get;set; }
publiclongtotalamounts{get;set; }
publiclongouteramounts{get;set; }
publicstringprjmanagername{get;set; }
publicstringprjstate{get;set; }
}
2.3 業務邏輯層設計實現
領域模型層和DTO模型層均構建完畢后,業務邏輯層的職責是領域模型和DTO模型之間的轉化。語言集成查詢(LanguageIntegratedQuery,LINQ)是一組語言特性和API,LINQtoEntities提供了查詢關系數據庫中的實體模型的方式[7]。在此層次中,系統使用LINQtoEntities技術,從領域模型實體中進行數據的增、刪、改、查。
以“我的子課題列表”的顯示為例,系統在接收到前臺的數據請求后,業務邏輯層使用LINQtoEntities技術將數據從數據庫中取出。示例代碼如下:
varquery=frommissin
database.MissionSet.OfType
wheremiss.ManagerId==userId
selectnew{
MissionId=miss.Id,
ProjectId=miss.ProjectId,
MissionName=miss.MissionName
};
查詢結束后,將結果根據列表所對應的DTO模型進行DTO模型屬性的賦值和組合,示例代碼如下:
foreach(varqinqueryList){
MyMissionListVOmmlVO=newMyMissionListVO(){
missionid=q.MissionId,
projectid=q.ProjectId,
mssname=q.MissionName};
this.missionListDTO.Add(mmlVO);
}
經過上述步驟,業務邏輯層就完成了領域模型與DTO模型的轉化。
2.4 數據轉化層和服務層設計實現
預算管理系統中,前后臺數據是通過JSON(JavaScriptObjectNotation)格式來傳輸的。JSON是一種輕量級的數據傳輸格式,易于閱讀和編碼,可以在多種語言之間進行數據交換[8]。數據轉化層將業務邏輯層傳來的DTO對象序列化成JSON格式的數據,或者根據服務層傳來的JSON格式的數據反序列化成DTO對象。
預算管理系統的數據轉化層使用JSON.NET技術實現JSON的序列化和反序列化。使用JSON.NET技術可以自動進行JSON的序列化和反序列化,是.NET框架下一款功能強大且高效的開源序列化和反序列化工具[9]。
以子課題更新功能為例,先將服務層傳來的子課題信息反序列化為DTO對象,交由業務邏輯層保存后,將返回的子課題再序列化為JSON返回給服務層。示例代碼如下:
MissionDTOmissionDTO=
JsonConvert.DeserializeObject
missionDTO=aarmb.SaveAndReturn(database);
json=
JsonConvert.SerializeObject(missionDTO,Formatting.Indented);
預算管理系統的服務層提供WebService供展示層調用,負責接收展示層發來的請求,并將數據傳給數據轉化層。
以子課題更新的WebService為例,服務層接收到前端的請求后,實例化數據轉化層的對象,將JSON等數據傳給數據轉化層。示例代碼如下:
publicclassAddAndReturnMissions:WebServiceBase{
[WebMethod]
publicvoidSaveAndReturn(stringmssParam){
AddAndReturnMissionsTransaarmT=
newAddAndReturnMissionsTrans();
aarmT.SaveAndReturn(Database,mssParam);}
}
2.5 展示層設計實現
預算管理系統的展示層采用ExtJS富客戶端框架。ExtJS是基于JavaScript語言開發的客戶端Ajax框架,優點是與后臺技術無關,而且瀏覽器兼容性較強[10]。
在確定完領域模型和DTO模型后,軟件的前臺開發人員利用ExtJS后臺技術無關的優點,并利用之前確定好的DTO模型和需求分析階段的原型界面即可編寫前端代碼。
預算管理系統利用ExtJS提供的視圖、表單、列表、表格等組件構建友好、美觀的用戶界面,并通過ExtJS提供的Ajax功能與后臺進行交互。以財務處管理員登錄后的界面為例,用戶登錄成功后,系統發起主界面的Ajax請求,取得相應數據并渲染到用戶界面。示例界面如圖7所示。

圖7 預算管理系統主界面
模型驅動的開發方式適用于需求急迫、領域概念復雜、對軟件質量要求高的軟件研發。本文針對預算管理系統的復雜需求,展示了模型驅動開發方式的實踐,軟件開發人員使用模型作為一種語言,與領域專家交流并不斷改進模型,快速地明確需求,使領域知識精確地消化于模型中。在明確模型之后,以模型為橋梁,使系統框架中各個層次并行開發,大大節約了時間成本。并行的開發使開發人員專注于各層次的功能需求,提高了代碼的質量。通過模型,軟件開發人員還可以挖掘潛在需求進行深度開發,進一步改進軟件的性能。
目前預算系統已上線使用,其在短期內的上線使用和其穩定性證明了文中介紹的基于模型驅動的開發方式的可行性、便利性和快捷性。
[1]EVANSE.領域驅動設計[M].趙俐,盛海艷,劉霞,等,譯.北京:人民郵電出版社, 2010.
[2] 黃睿.基于Java技術的ORM工具接口的設計與實現[D]. 長春:吉林大學,2012.
[3] 沈霞菲, 王建中.基于.NETEntityFramework數據庫訪問機制的設計與應用[J].現代電子技術,2014(24):5-8.
[4] 谷惠敏.基于Web的高校檔案管理系統設計[J].現代電子技術,2015(21):139-141.
[5]LERMANJ,MILLERR.Programmingentityframework:DbContext[M].O’reillyMedia,2012.
[6] 朱彬, 陳志軍.DTO模式的研究及對其實現的改進[J].沈陽航空航天大學學報,2004,21(4):53-55.
[7] 郭睿志, 邊力, 譚龍丹,等.數據庫查詢中LINQtoEntities應用研究[J].軟件導刊,2014(1):122-124.
[8] 高靜, 段會川.JSON數據傳輸效率研究[J].計算機工程與設計,2011,32(7):2267-2270.
[9]ALLENJ.Json.NETclaimssignificantperformanceimprovementsoverother.NETSerializers[J].InfoQ,2010.
[10] 易俗, 殷慧文.基于ExtJS的富客戶端聯通分銷商管理系統設計[J].遼寧大學學報(自然科學版),2015,42(2):143-149.
Model-driven design and implementation of the budget management system
GuoNingyuan,XuJianliang
(CollegeofInformationScience&Engineering,OceanUniversityofChina,Qingdao266100,China)
Aimingatthedomainconceptsandcomplexrequirementsoffinancialbudget,thispaperputsamethodofmodel-drivendevelopmentpracticeinthedesignandimplementationofthebudgetmanagementsystem.Thismethodmakesdevelopersgetridofthecomplexdatabasedesign,andfocusontheabsorptionofdomainconcepts,modelsandthecreationofadatatransferobject.Thispaperpresentstheoveralldescriptionandframeworkofbudgetmanagementsystemstructure,andintroducesthedesignandimplementationofeachlayeraccordingtothedevelopmentorder.Finally,combiningwiththeapplicationeffectofsystemitshowsthefeasibility,convenienceandrapidityofusingthismethodofmodel-drivendevelopment.
budgetmanagement;informationsystem;EntityFramework;ModelFirst;DTO;multi-layerarchitecture;JSON
TP
ADOI: 10.19358/j.issn.1674- 7720.2016.22.003
郭寧遠,徐建良.模型驅動的預算管理系統設計與實現[J].微型機與應用,2016,35(22):11-14.
2016-05-25)
郭寧遠(1990-),男,碩士研究生,主要研究方向:軟件工程與智能信息系統。
徐建良(1969-),男,博士,教授,主要研究方向:計算復雜性理論、計算機軟件與理論。