摘 要: 針對傳統(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ù)使用效率不高,?;贐/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)以及訪問方法。當(dāng)對象的模型不變, 而只改變數(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)接口中的所有方法,;實體層負責(zé)整個系統(tǒng)中數(shù)據(jù)的封裝及傳遞,定義的對象實體只有屬性沒有方法,。系統(tǒng)應(yīng)用框架如圖1所示,。
本框架設(shè)計中,,視圖層由ASPX/HTML頁面結(jié)合Ext JS框架完成界面顯示和Ajax請求,;控制器功能在.ashx.cs文件中實現(xiàn),,其主要負責(zé)用戶請求和后臺業(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ù)器端僅負責(zé)業(yè)務(wù)邏輯的處理和運算,并把處理的結(jié)果以純數(shù)據(jù)的形式發(fā)送給客戶端,,由客戶端負責(zé)具體的顯示和交互,,解決了以往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),其負責(zé)接收用戶輸入的終端信息,,通過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.