李紹華+馮晶瑩
摘要:該文將傳統(tǒng)三層架構(gòu)模式和基于抽象工廠模式的三層架構(gòu)進(jìn)行了對(duì)比?;诟倪M(jìn)的三層架構(gòu)模式,使用Visual Stu-dio 2013和SQL Server 2012設(shè)計(jì)和開(kāi)發(fā)了科研項(xiàng)目管理系統(tǒng),實(shí)現(xiàn)項(xiàng)目管理的信息化。使用存儲(chǔ)過(guò)程提高系統(tǒng)的執(zhí)行效率和安全性。
關(guān)鍵詞:科研系統(tǒng);三層架構(gòu);抽象工廠;ASP.NET
1背景
隨著高校教師對(duì)科研項(xiàng)目申報(bào)數(shù)量的增加,項(xiàng)目管理部門(mén)的任務(wù)日漸繁重,而使用傳統(tǒng)手工方式對(duì)項(xiàng)目進(jìn)行管理的形式越來(lái)越不能適應(yīng)時(shí)代發(fā)展的要求,嚴(yán)重影響了相關(guān)人員的工作效率和準(zhǔn)確性。
信息化和網(wǎng)絡(luò)化進(jìn)程的不斷加速,在大數(shù)據(jù)時(shí)代通過(guò)運(yùn)用現(xiàn)代網(wǎng)絡(luò)和計(jì)算機(jī)技術(shù),構(gòu)建高效和實(shí)用的信息管理平臺(tái),實(shí)現(xiàn)科研項(xiàng)目管理工作的數(shù)字化成為可能,它可以有效的縮短管理時(shí)間、簡(jiǎn)化管理過(guò)程。
2三層架構(gòu)體系結(jié)構(gòu)
NET軟件項(xiàng)目設(shè)計(jì)為了實(shí)現(xiàn)“高內(nèi)聚、低耦合”的設(shè)計(jì)思想,通常使用三層架構(gòu)模式(視圖層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層),將項(xiàng)目代碼根據(jù)功能寫(xiě)在不同的層次模型中。如圖1所示。
1)視圖層:直接和用戶(hù)進(jìn)行交互,收集用戶(hù)在界面中輸入的數(shù)據(jù)并通過(guò)調(diào)用方法時(shí),實(shí)參給形參傳值,傳遞給業(yè)務(wù)邏輯層;將業(yè)務(wù)邏輯層方法返回的數(shù)據(jù)以某種形式顯示在界面中。
2)業(yè)務(wù)邏輯層:負(fù)責(zé)數(shù)據(jù)的加工處理,在視圖層和數(shù)據(jù)訪問(wèn)層之間起到數(shù)據(jù)中轉(zhuǎn)站的作用。
3)數(shù)據(jù)訪問(wèn)層:負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和讀取。根據(jù)業(yè)務(wù)邏輯層傳遞過(guò)來(lái)的指令和數(shù)據(jù),通過(guò)INSERT、UPDATE、DELETE或SELECT語(yǔ)句操作數(shù)據(jù)庫(kù)。.NET框架中使用ADO.NET的連接類(lèi)、命令類(lèi)、數(shù)據(jù)讀取類(lèi)、數(shù)據(jù)適配器類(lèi)和數(shù)據(jù)集類(lèi)等操作數(shù)據(jù)庫(kù)。
4)實(shí)體層:將數(shù)據(jù)庫(kù)中關(guān)系型表進(jìn)行面向?qū)ο蠡幚?,?shí)現(xiàn)數(shù)據(jù)對(duì)象在視圖層和業(yè)務(wù)邏輯層之間的傳遞。
根據(jù)項(xiàng)目規(guī)模和需求,可以選擇Oracle、SQL Server、DB2、Sybase、MySQL、Access等關(guān)系型數(shù)據(jù)庫(kù)。這些數(shù)據(jù)庫(kù)都遵循結(jié)構(gòu)化查詢(xún)語(yǔ)句(Structure Query Language,SQL),但不同數(shù)據(jù)庫(kù)的SQL文、存儲(chǔ)過(guò)程、函數(shù)、觸發(fā)器、游標(biāo)的使用規(guī)則不盡相同。
在ADO.NET框架中,針對(duì)不同數(shù)據(jù)庫(kù)使用不同的命名空間中的類(lèi)。例如:
在傳統(tǒng)的三層架構(gòu)體系中,視圖層依賴(lài)于業(yè)務(wù)邏輯層,業(yè)務(wù)邏輯層依賴(lài)于數(shù)據(jù)訪問(wèn)層。如果后臺(tái)使用的數(shù)據(jù)庫(kù)發(fā)生變化,數(shù)據(jù)訪問(wèn)層和業(yè)務(wù)邏輯層的代碼都需要大量修改,不利于系統(tǒng)的擴(kuò)展。3抽象工廠模式
例如,A廠生產(chǎn)布料,B廠生產(chǎn)紐扣,c廠生產(chǎn)針線。但客戶(hù)要的是衣服,這樣就需要一個(gè)D廠,D就是專(zhuān)門(mén)制作衣服的。客戶(hù)需要衣服不必去找ABC廠,直接找D即可??蛻?hù)也不必知道D的衣服是怎樣做成的。ABC廠的變化不會(huì)直接影響到客戶(hù)。
抽象工廠模式提供創(chuàng)建一系列相關(guān)或相互依賴(lài)的接口,而無(wú)需指定他們具體的類(lèi)。從字面上的理解就是給上一層或調(diào)用者提供一系列功能的接口,讓上層或調(diào)用者自己去實(shí)現(xiàn)。在具體工廠中負(fù)責(zé)創(chuàng)建產(chǎn)品結(jié)構(gòu)中每個(gè)產(chǎn)品,它包含了創(chuàng)建不同產(chǎn)品的商業(yè)邏輯,實(shí)現(xiàn)抽象工廠中的接口,定義產(chǎn)品的共同接口。
抽象工廠模式可有效降低模塊間的耦合性,最大限度地實(shí)現(xiàn)軟件復(fù)用,實(shí)現(xiàn)“高內(nèi)聚、低耦合”的設(shè)計(jì)目的。
4基于抽象工廠模式的三層架構(gòu)體系
為了解決傳統(tǒng)三層架構(gòu)模式層與層高依賴(lài)度,不利于擴(kuò)展的弊端,推薦使用基于抽象工廠模式的三層架構(gòu)體系。抽象工廠模式引入了面向接口編程思想,使上層類(lèi)不具體依賴(lài)于下層類(lèi),而只依賴(lài)于下層提供的一個(gè)接口。將數(shù)據(jù)訪問(wèn)層細(xì)分為數(shù)據(jù)接口層、數(shù)據(jù)接口實(shí)現(xiàn)層、數(shù)據(jù)工廠層以及數(shù)據(jù)工具層,從而使得業(yè)務(wù)邏輯層依賴(lài)于數(shù)據(jù)接口層,與后臺(tái)數(shù)據(jù)庫(kù)不發(fā)生直接關(guān)系?;诠S模式的三層架構(gòu)體系如圖2所示。
如果項(xiàng)目更換后臺(tái)數(shù)據(jù)庫(kù),只需要修改抽象工廠模式的數(shù)據(jù)訪問(wèn)層即可。
5科研系統(tǒng)的框架設(shè)計(jì)
1)使用Visual Studio 2013創(chuàng)建名為SRM的空白解決方案。新增名為SRMUI的ASP.NET空網(wǎng)站項(xiàng)目;名為Business、DALFactory、DBUtility、Entity、IDAL、SQLServerDAL和ToolUtili-ty的類(lèi)庫(kù)項(xiàng)目,如圖3所示。
為了便于統(tǒng)一管理,設(shè)置七個(gè)類(lèi)庫(kù)項(xiàng)目的程序集名稱(chēng)和默認(rèn)命名空間為SRM.Business、SRM.DALFactory、SRM.DBUtility、SRM.Entity、SRM.IDAL、SRM.SQLServerDAL和SRM.ToolUtili-ty。如圖4所示。
根據(jù)依賴(lài)關(guān)系,為程序集添加引用:SRMUI引用Business、Entity和ToolUtility;Business引用IDAL、DALFactory和Entity;DALFaetory引用IDAL;IDAL引用Entity;SQLServerDAL引用DBUtility、IDAL和Entity。
21為數(shù)據(jù)庫(kù)中每張表,在Business程序集中創(chuàng)建對(duì)應(yīng)的業(yè)務(wù)邏輯類(lèi),如圖5示。該層不直接依賴(lài)數(shù)據(jù)訪問(wèn)層,而是依賴(lài)IDAL接口層和DALFaetory工廠層。通過(guò)工廠層創(chuàng)建程序集指定類(lèi)的實(shí)例,并決定調(diào)用哪個(gè)數(shù)據(jù)訪問(wèn)層的數(shù)據(jù)操作方法。
3)為數(shù)據(jù)庫(kù)中每張表,在Entity程序集中創(chuàng)建對(duì)應(yīng)的實(shí)體類(lèi),如圖6所示。實(shí)現(xiàn)數(shù)據(jù)以對(duì)象的形式在SRMUI、Business、IDAL和SQLServerDAL之間傳遞。
4)為數(shù)據(jù)庫(kù)中每張表,在IDAL程序集中創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)接口,如圖7所示。接口中聲明了在SQLServerDAL程序集中實(shí)現(xiàn)的方法。
5)為數(shù)據(jù)庫(kù)中每張表,在SQLServerDAL程序集中創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)接口實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)IDAL程序集中接口的方法,如圖8所示。根據(jù)數(shù)據(jù)庫(kù)的類(lèi)型,可以定義OracleDAL、MySQLDAL或AccessDAL等。
在SQLServerDAL程序集中,本項(xiàng)目使用存儲(chǔ)過(guò)程實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,原因如下:
①執(zhí)行效率高。存儲(chǔ)過(guò)程只在創(chuàng)建時(shí)進(jìn)行編譯,以后每次執(zhí)行存儲(chǔ)過(guò)程都不需再重新編譯,而SQL語(yǔ)句每執(zhí)行一次就編譯一次。
②方便事務(wù)處理。當(dāng)對(duì)數(shù)據(jù)庫(kù)進(jìn)行多個(gè)復(fù)雜操作時(shí),可將復(fù)雜操作用存儲(chǔ)過(guò)程封裝起來(lái)與數(shù)據(jù)庫(kù)提供的事務(wù)處理結(jié)合一起使用。
③提高代碼復(fù)用性。存儲(chǔ)過(guò)程可以重復(fù)使用,減少數(shù)據(jù)庫(kù)開(kāi)發(fā)人員的工作量。
④安全性高。通過(guò)權(quán)限設(shè)定,可指定只有某些用戶(hù)才具有對(duì)指定存儲(chǔ)過(guò)程的使用權(quán)。
⑤減少網(wǎng)絡(luò)流量。存儲(chǔ)過(guò)程位于服務(wù)器上,調(diào)用的時(shí)候只需要傳遞存儲(chǔ)過(guò)程名稱(chēng)以及參數(shù)即可,降低網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。
6)在DALFactory程序集中添加DataAccess類(lèi),如圖9所示。DALFactory通過(guò)配置文件和反射機(jī)制實(shí)現(xiàn)SQLServerDAL的實(shí)例化,是通過(guò)多態(tài)機(jī)制實(shí)現(xiàn)的,如圖10所示。這樣的好處就是如果要更換數(shù)據(jù)庫(kù),只需要更改Web.config配置文件,如圖11所示。
使用反射機(jī)制動(dòng)態(tài)的創(chuàng)建類(lèi)型的實(shí)例,將類(lèi)型綁定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象中獲取類(lèi)型應(yīng)用程序需要在運(yùn)行時(shí)從某個(gè)特定的程序集中載人一個(gè)特定的類(lèi)型,以便實(shí)現(xiàn)某個(gè)任務(wù)時(shí)可以用到反射。反射主要應(yīng)用于類(lèi)庫(kù),這些類(lèi)庫(kù)需要知道一個(gè)類(lèi)型的定義,以便提供更多的功能。
7)在DBUtility程序集中添加SQLDBHelper類(lèi),實(shí)現(xiàn)與SQLServer數(shù)據(jù)庫(kù)的交互。如圖12所示。根據(jù)數(shù)據(jù)庫(kù)的種類(lèi),可以定義0racleDBHelper、MySQLDBHelper或AccessDBHelper等。
8)在ToolUtility程序集中添加若干個(gè)工具類(lèi)。如圖13所示。
6科研系統(tǒng)的運(yùn)行
科研項(xiàng)目管理系統(tǒng)的首頁(yè)運(yùn)行如圖14所示。
7結(jié)束語(yǔ)
科研項(xiàng)目管理信息化平臺(tái)可以實(shí)現(xiàn)對(duì)項(xiàng)目活動(dòng)的全程跟蹤。信息化平臺(tái)將人員、項(xiàng)目、評(píng)審、成果和權(quán)限等管理有機(jī)結(jié)合在一起,有效地提高了項(xiàng)目成果管理水平和效率?;诔橄蠊S模式三層體系架構(gòu)的使用,便于項(xiàng)目的移植和擴(kuò)展。endprint