摘 要: 針對傳統(tǒng)ASP、PHP、JSP等技術(shù)開發(fā)的Web應(yīng)用系統(tǒng)層次不夠分明、業(yè)務(wù)分工不夠明確等不足,結(jié)合MVC設(shè)計模式、Ext JS、Spring .NET和對象持久化NHibernate等技術(shù),提出了一種基于.NET平臺的Web應(yīng)用程序框架,并結(jié)合實例詳細分析了該應(yīng)用框架在用電信息采集系統(tǒng)開發(fā)中的應(yīng)用?;谠摽蚣荛_發(fā)的用電信息采集Web應(yīng)用系統(tǒng)面向接口編程,細化了傳統(tǒng)三層式結(jié)構(gòu)的軟件開發(fā),實現(xiàn)了頁面顯示邏輯、業(yè)務(wù)應(yīng)用邏輯和數(shù)據(jù)訪問邏輯的高效分離,具有松耦合性以及很強的可擴展性。
關(guān)鍵詞: 信息采集; MVC; Ext JS; Spring.NET; 對象持久化
傳統(tǒng)的用電信息采集系統(tǒng)主站軟件開發(fā)大多采用C/S模式,其數(shù)據(jù)采集和業(yè)務(wù)應(yīng)用等操作均在一個業(yè)務(wù)內(nèi)網(wǎng)中完成,其數(shù)據(jù)僅能提供給業(yè)務(wù)內(nèi)網(wǎng)所覆蓋的少數(shù)內(nèi)部相關(guān)人員使用,數(shù)據(jù)使用效率不高。基于B/S模式開發(fā)的用電信息采集系統(tǒng)將應(yīng)用程序處理部分集中于服務(wù)器端完成,用戶界面統(tǒng)一采用瀏覽器,無需安裝客戶端程序,任意授權(quán)上網(wǎng)客戶均可獲得最快捷的個人網(wǎng)上交互式服務(wù)。與此同時,維護人員也不再為程序的維護工作奔波于每個客戶機之間,而把主要精力放在功能服務(wù)器的程序更新工作上。
然而在B/S模式開始盛行時,基于Web開發(fā)的用電信息采集系統(tǒng)大多采用ASP、PHP、JSP等技術(shù),將業(yè)務(wù)邏輯和頁面顯示混合在一起,極其不利于分工與協(xié)作;而且在業(yè)務(wù)邏輯中采用內(nèi)嵌SQL語句的方式完成數(shù)據(jù)訪問,一旦數(shù)據(jù)庫或者類定義中一方發(fā)生變化,就會導(dǎo)致系統(tǒng)的大幅修改,不利于系統(tǒng)的維護。針對以上不足,本文結(jié)合MVC設(shè)計模式、Ext JS、Spring.NET和對象關(guān)系映射NHibernate等多項技術(shù),提出了一種基于.NET平臺的Web應(yīng)用框架,并分析了該框架在用電信息采集主站系統(tǒng)中的實際應(yīng)用,為解決Web應(yīng)用的不足提供一種解決方案。
1 Web應(yīng)用框架研究
1.1 MVC設(shè)計模式
MVC架構(gòu)是許多交互和界面系統(tǒng)的構(gòu)成基礎(chǔ),其核心是實現(xiàn)系統(tǒng)不同層次間的松散耦合。它把一個應(yīng)用任務(wù)的輸入、處理、輸出流程按照模型、視圖、控制器的方式進行分離,同時各個模塊之間相互獨立,提高了靈活性和可重用性。
在.NET平臺下,ASP.NET提供了一個很好的實現(xiàn)MVC設(shè)計模式的類似環(huán)境。開發(fā)者通過在ASPX頁面中結(jié)合Ext JS框架開發(fā)用戶接口來實現(xiàn)視圖;控制器的功能在邏輯功能后臺代碼(.aspx.cs/.ashx.cs)中實現(xiàn);模型通常對應(yīng)于系統(tǒng)的業(yè)務(wù)應(yīng)用部分。
1.2 Ext JS框架
Ext JS是一個用JavaScript編寫、與后臺技術(shù)無關(guān)的前端Ajax框架,可以用來開發(fā)富有華麗外觀的富客戶端應(yīng)用,能使B/S應(yīng)用更加具有活力。Ext JS融入了面向?qū)ο蟮母拍?,讓開發(fā)者可以像理解其他面向?qū)ο笳Z言一樣,靈活地運用JavaScript語言,在支持面向?qū)ο蟮耐瑫r還提供了豐富的跨瀏覽器UI組件,靈活采用XML/JSON數(shù)據(jù)源進行開發(fā),使得服務(wù)端表示層的負荷真正減輕,從而實現(xiàn)客戶端的MVC應(yīng)用。
1.3 Spring.NET框架
Spring.NET是一個開源的應(yīng)用程序框架,它能夠提供寬廣范圍的功能,例如依賴注入、面向方面編程(AOP)、ORM類庫整合等。依賴注入功能由框架提供的一種輕量級的控制反轉(zhuǎn)IoC容器來完成。該容器改變了傳統(tǒng)的在程序中強制聲明對象的創(chuàng)建方法,實現(xiàn)了一種配置式的對象管理方式,降低了類之間的耦合度。AOP為業(yè)務(wù)對象提供面向方面編程(AOP)的支持,完善了IoC容器的功能,為創(chuàng)建企業(yè)應(yīng)用和使用聲明式服務(wù)奠定了堅實的基礎(chǔ)。ORM類庫整合為時下流行的ORM類庫(如NHibernate等)提供了一個整合層,其中包含聲明式事務(wù)管理等諸多功能。
1.4 NHibernate框架
NHibernate是一個基于.NET的針對關(guān)系型數(shù)據(jù)庫的對象關(guān)系映射ORM(Object/Relation Mapping)框架。對象關(guān)系映射ORM的最主要目的是為了解決關(guān)系型數(shù)據(jù)庫與面向?qū)ο缶幊碳夹g(shù)中面向?qū)ο蟮念惻c數(shù)據(jù)庫的表不是一一對應(yīng)的“阻抗不匹配”問題。NHibernate從數(shù)據(jù)庫底層來持久化.NET對象到關(guān)系型數(shù)據(jù)庫,它封裝了底層的數(shù)據(jù)庫SQL操作,上層應(yīng)用程序不需要知道數(shù)據(jù)庫管理系統(tǒng)的類型、數(shù)據(jù)表的結(jié)構(gòu)以及訪問方法。當對象的模型不變, 而只改變數(shù)據(jù)庫管理系統(tǒng)或者改變數(shù)據(jù)表的結(jié)構(gòu)時,則只須修改相應(yīng)的NHibernate映射文件和配置文件,不需要對程序代碼進行大的修改, 因而使得應(yīng)用程序具有較好的可移植性。
2 Web應(yīng)用框架設(shè)計
傳統(tǒng)的Web應(yīng)用系統(tǒng)中,通常將系統(tǒng)劃分為Web表示層、業(yè)務(wù)應(yīng)用層和數(shù)據(jù)層3個部分。采用MVC設(shè)計模式的Web應(yīng)用系統(tǒng),表示層被細分為視圖層和控制器層,模型則通常對應(yīng)系統(tǒng)的業(yè)務(wù)應(yīng)用部分。在業(yè)務(wù)應(yīng)用層將表示層、業(yè)務(wù)邏輯與數(shù)據(jù)訪問進行分離,細分為業(yè)務(wù)邏輯層接口、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問接口層和數(shù)據(jù)訪問層、實體層。Web表示層只依賴于業(yè)務(wù)邏輯層接口和實體層,即在表示層由控制器調(diào)用業(yè)務(wù)邏輯層接口定義的方法,并處理返回的實體層數(shù)據(jù);業(yè)務(wù)邏輯層實現(xiàn)了業(yè)務(wù)邏輯層接口,同時依賴于數(shù)據(jù)訪問接口層和實體層,這一層實際是調(diào)用數(shù)據(jù)訪問接口層中的方法組合為業(yè)務(wù),并處理數(shù)據(jù)訪問接口層返回的實體層數(shù)據(jù);數(shù)據(jù)訪問接口層定義了訪問數(shù)據(jù)的底層方法;數(shù)據(jù)訪問層實現(xiàn)接口中的所有方法;實體層負責整個系統(tǒng)中數(shù)據(jù)的封裝及傳遞,定義的對象實體只有屬性沒有方法。系統(tǒng)應(yīng)用框架如圖1所示。
本框架設(shè)計中,視圖層由ASPX/HTML頁面結(jié)合Ext JS框架完成界面顯示和Ajax請求;控制器功能在.ashx.cs文件中實現(xiàn),其主要負責用戶請求和后臺業(yè)務(wù)層的中轉(zhuǎn)、接收并分析用戶請求,調(diào)用業(yè)務(wù)邏輯層類完成請求,再分發(fā)給用戶。數(shù)據(jù)庫訪問層采用NHibernate框架將關(guān)系數(shù)據(jù)庫的數(shù)據(jù)映射成對象, 實現(xiàn)以面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫。系統(tǒng)中的各層之間借助于Spring.Net框架的IoC容器以松耦合的方式組合在一起,即表示層的控制器訪問業(yè)務(wù)邏輯層時,調(diào)用的是業(yè)務(wù)邏輯層接口IBLL,具體的業(yè)務(wù)對象實現(xiàn)則由Spring.NET框架的IoC容器動態(tài)注入。同理,業(yè)務(wù)邏輯層的實現(xiàn)調(diào)用的是數(shù)據(jù)訪問層的接口IDAL,同樣由IoC容器注入具體的數(shù)據(jù)訪問層實現(xiàn)。
綜上所述,本框架具備如下優(yōu)點:
(1)將Web開發(fā)的三層架構(gòu)進行細分,結(jié)構(gòu)清晰,功能完備,使得系統(tǒng)的開發(fā)更加有條理、更加便捷。
(2)對于大型的企業(yè)應(yīng)用,前端頁面顯示復(fù)雜,共享代碼較多,使用MVC模式分離顯示與業(yè)務(wù)邏輯就使得共享代碼便于管理和修改,降低了依賴性。
(3)采用富客戶端Ext JS框架。將顯示邏輯從服務(wù)器端轉(zhuǎn)移到客戶端,服務(wù)器端僅負責業(yè)務(wù)邏輯的處理和運算,并把處理的結(jié)果以純數(shù)據(jù)的形式發(fā)送給客戶端,由客戶端負責具體的顯示和交互,解決了以往Web應(yīng)用系統(tǒng)性能低下、效率低、開發(fā)出的界面千篇一律等問題。
(4)框架面向接口編程,充分利用Spring.NET依賴注入特性,改變了傳統(tǒng)的在程序中強制聲明對象的創(chuàng)建方法,實現(xiàn)了一種配置式的對象管理方式,降低了層次之間的耦合度。
(5)將數(shù)據(jù)訪問從業(yè)務(wù)邏輯中分離出來,采用NHibernate對象關(guān)系映射框架從數(shù)據(jù)庫底層來持久化.NET對象到關(guān)系型數(shù)據(jù)庫,無需采用內(nèi)嵌SQL語句的方式完成數(shù)據(jù)訪問,提高了系統(tǒng)的可移植性。
3 采集系統(tǒng)軟件設(shè)計
3.1 系統(tǒng)功能模塊設(shè)計
用電信息采集系統(tǒng)是對電力用戶的用電信息進行采集、處理和實時監(jiān)控的系統(tǒng),軟件功能可歸納為系統(tǒng)管理、參數(shù)設(shè)置、終端控制和數(shù)據(jù)查詢4大模塊。軟件模塊如圖2所示。
3.2 數(shù)據(jù)庫設(shè)計
用電信息采集系統(tǒng)包含的數(shù)據(jù)實體根據(jù)不同功能可分為管理類實體、數(shù)據(jù)采集類實體和電網(wǎng)模型類實體3種類型,每個實體包含一個或者多個數(shù)據(jù)表。管理類實體主要包括與系統(tǒng)管理相關(guān)的實體,如系統(tǒng)功能、管理部門、崗位、操作員、操作員分組、用戶、用戶組、角色等;數(shù)據(jù)采集類實體主要指電能信息數(shù)據(jù)實體以及和電能信息數(shù)據(jù)采集相關(guān)的實體,如電表信息、終端信息、終端配置參數(shù)、終端控制狀態(tài)、前置機、電能量、模擬量、任務(wù)配置、異常日志等;電網(wǎng)模型類實體主要指與電網(wǎng)設(shè)備和電網(wǎng)拓撲相關(guān)的各種實體,如區(qū)域、變電站、電壓等級、變壓器、線路、開關(guān)等。
4 基于Web應(yīng)用框架的采集系統(tǒng)實現(xiàn)
在Visual Studio 2008中搭建起整個項目的解決方案,命名為FK。通過建立不同的工程來劃分層,每一個工程使用不同的命名空間。FK.Web實現(xiàn)Web表示層;FK.IBLL實現(xiàn)業(yè)務(wù)邏輯層接口;FK.BLL實現(xiàn)業(yè)務(wù)邏輯層;FK.Model實現(xiàn)實體層;FK.IDAL實現(xiàn)數(shù)據(jù)訪問層接口;FK.NHDAL通過NHibernate實現(xiàn)數(shù)據(jù)訪問層;FK.Controler實現(xiàn)業(yè)務(wù)邏輯的調(diào)用。
下面以系統(tǒng)管理模塊中添加終端設(shè)備操作的實現(xiàn)為例說明基于.NET的Web應(yīng)用框架在用電信息采集主站系統(tǒng)中的具體應(yīng)用,其中涉及的業(yè)務(wù)邏輯包括將終端信息存儲入庫以及向前置機下發(fā)終端配置信息兩部分,UML類圖如圖3所示。
(1)實體層實現(xiàn)
實體層在FK.Model. DeviceTable類中實現(xiàn),其中定義的對象實體只有屬性沒有方法。主要包括終端設(shè)備相關(guān)屬性信息。部分代碼如下:
namespace FK.Model { public class DeviceTable{
public virtual string DeviceID {get; set;} //終端ID
public virtual string DeviceName {get; set;}
//終端名稱 <!--省略其它屬性信息--> }}
(2)數(shù)據(jù)訪問層實現(xiàn)
數(shù)據(jù)訪問層使用Spring.NET提供的HibernateDaoSupport作為基類,通過該基類的HibernateTemplate對象來完成數(shù)據(jù)訪問操作。HibernateTemplate封裝了對象持久化的CRUD等基本操作(底層的數(shù)據(jù)庫訪問由NHibernate來具體實現(xiàn))。這里由DeviceTableDao類來完成終端設(shè)備信息的存儲入庫。
數(shù)據(jù)庫訪問DeviceTableDao類繼承于接口IDeviceTableDao和HibernateDaoSupport類。HibernateDaoSupport類的HibernateTemplate屬性通過Spring.NET IoC容器從外部注入,同時還通過IoC容器向HibernateTemplate中注入SessionFactory,然后在Spring.NET中聲明一個SessionFactory的對象。配置文件Web.config部分注入代碼如下:
<!--將id為HibernateTemplate的對象注入到數(shù)據(jù)訪問類-->
<object id= "DeviceTableDao" type="FK.DAL.Device
TableDao,F(xiàn)K.DAL">
<property name="HibernateTemplate" ref="HibernateTemplate"/></object>
(3)業(yè)務(wù)邏輯層實現(xiàn)
業(yè)務(wù)邏輯層通過PreServerCommManage類和Device
TableManage類分別實現(xiàn)向前置機下發(fā)終端配置信息以及將終端信息存儲入庫等業(yè)務(wù)邏輯。在業(yè)務(wù)邏輯層的具體實現(xiàn)中,用到了數(shù)據(jù)訪問接口IDeviceTableDao屬性,通過Spring.NET IoC注入具體的數(shù)據(jù)訪問實現(xiàn),配置文件Web.config注入代碼如下:
<!—聲明DeviceTableManage業(yè)務(wù)邏輯類,將類Device
TableDao注入到業(yè)務(wù)邏輯類-->
<object id="DeviceTableManage"type="FK.BLL.DataBase.DeviceTableManage, FK.BLL.DataBase">
<property name=" DeviceTableDao"ref="DeviceTableDao"/></object>
(4)視圖層實現(xiàn)
視圖層主要由HTML結(jié)合Ext JS框架實現(xiàn),其負責接收用戶輸入的終端信息,通過Ext.Ajax實現(xiàn)與控制層的通信,并顯示控制層的業(yè)務(wù)邏輯調(diào)用執(zhí)行結(jié)果,關(guān)鍵代碼如下:
var amr = Ext.getCmp('createDevice');//獲取界面上輸入的終端設(shè)備數(shù)據(jù),保存在Dev.DeviceData變量中
Dev.DeviceData={DeviceName: amr.items.itemAt(0).items.itemAt(0).getValue(),<!--省略其他元素獲取代碼--> }
Ext.Ajax.request( params: { DeviceData: FK.Global.Encode(FK.Global.ToJson(Dev.DeviceData)) })//實現(xiàn)視圖層與控制層的通信
(5)控制層實現(xiàn)
控制層通過視圖層獲取終端設(shè)備的輸入數(shù)據(jù),并調(diào)用業(yè)務(wù)邏輯層方法完成具體的業(yè)務(wù)邏輯,這里調(diào)用的是業(yè)務(wù)邏輯接口,具體的業(yè)務(wù)邏輯層通過Spring.NET IoC容器注入予以實現(xiàn)。實現(xiàn)文件Device.ashx.cs終端添加入庫操作關(guān)鍵代碼如下:
Spring.Context.IApplicationContext ctx = ContextRegistry.GetContext(); //建立ApplicationContext容器實例
FK.IBLL.DataBase.IDeviceTableManager
//建立DeviceTableManage業(yè)務(wù)對象實例
sameDev= ctx.GetObject ("FK.BLL.DataBase.DeviceTable
Manage") as FK.IBLL.DataBase.IDeviceTableManager;
sameDev.Add(DeviceData); //實現(xiàn)終端添加入庫操作
綜上所述,以系統(tǒng)設(shè)備管理模塊中添加終端設(shè)備操作為例,從系統(tǒng)各層次詳細分析了基于.NET平臺的Web應(yīng)用框架在用電信息采集系統(tǒng)中的應(yīng)用。
本文采用Ext JS+ASP.NET MVC+Spring.NET+NHibernate等技術(shù)構(gòu)建多層Web應(yīng)用程序框架,并分析了該框架在用電信息采集系統(tǒng)主站中的具體應(yīng)用。本框架面向接口編程,具有松耦合性以及很強的可擴展性,比較適合用電信息采集系統(tǒng)多應(yīng)用平臺的開發(fā)。Spring.NET IoC作為整個框架的容器,充分利用其依賴注入的特性,實現(xiàn)了組件間的松耦合;NHibernate的本質(zhì)是一個提供數(shù)據(jù)庫服務(wù)的中間件,它的使用使整個框架更面向?qū)ο?,同時支持多數(shù)據(jù)庫;ASP.NET MVC一改以往Web Form的方式,使界面和后臺代碼完全分開;Ext Js則創(chuàng)建出更美觀、用戶體驗更好的界面, 能夠很方便地完成ASP.NET Web Form很難完成的功能和界面。
參考文獻
[1] 陳瑋,沈雷.基于MVC模式的Web應(yīng)用框架[J]. 微計算機信息,2009(15):216-218.
[2] 李園,陳世平. MVC設(shè)計模式在ASP.NET平臺中的應(yīng)用[J].計算機工程與設(shè)計,2009,30(13):3180-3184.
[3] 任偉,林曉東.基于Spring框架和Ext JS的藥品庫房管理系統(tǒng)實現(xiàn)[J].計算機工程與設(shè)計,2009,30(18):4312-4316.