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