趙愛美
摘 要: 許多系統都用到了多個不同類型的數據源,或在不同類型數據源之間進行切換。如果利用原有.NET三層架構,當增加或改變一種不同類型的數據源時,需要修改大量的代碼。為此,基于.NET框架,采用簡單工廠模式和反射機制對原有的三層架構進行了改進,使系統在不改變界面層和業務邏輯層的情況下,實現了數據源的擴展。運用改進的方法以教學資源庫系統為例,以C#語言進行了實現。
關鍵詞: .NET; 簡單工廠模式; 反射; 多數據源
中圖分類號:TP311 文獻標志碼:A 文章編號:1006-8228(2013)05-43-02
Development and application of multi-data source system based on .NET
Zhao Aimei
(Shandong Foreign Trade Vocational College, Qingdao, Shandong 266071, China)
Abstract: Numerous systems use various types of data sources, or they switch between different types of data sources. If using the original .NET three-layer architecture, when adding or changing a different type of data source, considerable codes needs modifying. Therefore, based on .NET framework, simple factory pattern and reflection on the three-layer architecture is applied to improve the original system. The system is adjusted to adapt to the new different data source without changing the interface layer and business logic layer. In this paper, take teaching resource library system using improved method as an example, the C# language is realized.
Key words: .NET; simple factory pattern; refrection; multi-data source
0 引言
應用程序能夠支持多種不同類型數據庫,這對程序的擴展,以及和現有系統共用數據庫都有很大的益處。以教學資源庫系統為例,一方面教學資源庫建設是一個長期的系統工程,在教學資源庫系統建成后應考慮系統的可擴展性;另一方面教學資源庫系統應充分利用現有數據庫資源。一直以來國家非常重視精品課程的建設,各院校都有了一定數量的國家級、省級和院級的精品課程,這對提高教學質量,提高學生的素質無疑起到了很大的促進作用。但這些精品課程網站采用了SQL Server、Aceess、Oracle等不同類型的數據庫,如果摒棄現有的數據庫,在資源上會有很大的浪費,因此對現有的多數據源進行集成是我們急需研究的課題。
本文對現有三層Web應用程序架構加以改造,在三層架構中的數據訪問層加入了.NET簡單工廠模式和反射機制,使系統在無需修改界面層和業務邏輯層源代碼,少量修改或增加數據庫訪問層源代碼的情況下就可以實現在不同類型數據源之間的切換。改造后的系統在不影響現有性能,也不會帶來新缺陷的前提下,擴展了對新數據源的適應性。
1 目前架構存在的問題
目前軟件架構普遍采用三層結構化設計,即將系統劃分為界面層(User Interface)、業務邏輯層(Business Logic Layer)和數據訪問層(Data Access Layer)。三層架構體現了“高內聚,低耦合”的思想,這對權責劃分、軟件的復用、后期維護等方面都有很大的益處。
但當系統需要多種數據源或需要在多種數據源之間進行切換時表現出的可移植性很差。如圖1所示,當系統需要訪問SQL Server數據庫時,在數據庫訪問層需要直接使用一些諸如SqlConnection、SqlCommand等對象,業務邏輯層為了使用這些服務,必須引用具體的數據訪問類(數據訪問層)的對象。假設系統需要切換成Accesss數據庫,數據訪問層則使用OleDbConnection、OleDbCommand等對象,對應的業務邏輯層也需要做相應改變。因此運用原有三層架構數據訪問層雖然封裝了數據訪問的功能,并為業務邏輯層提供了服務,但當系統需要增加或修改某種數據源時必須修改或增加大量代碼。這增大了層間的耦合性,同時減弱了業務邏輯層的內聚力。因此我們需要采用某種模式或機制,使業務邏輯層專注于使用下層提供的數據訪問服務而不必管是由哪種數據源來提供這種服務的。
[界面層(UI)][業務邏輯層(BLL)][SQLServerBLL][AccessBLL][數據訪問層(DAL)][SQLServerDAL
SqlConnection等][AccessDAL
OleDbConnection等] [SQL Server
數據庫] [Access
數據庫]
圖1 修改前的三層架構
2 解決方法:三層架構+簡單工廠模式+反射機制
在原有三層架構的基礎上,在數據訪問層建立一個抽象工廠并抽象出一個通用接口,從而可以在不改變業務邏輯層的情況下有不同的數據訪問層實現,比如一個系統同時支持Access,SQL Server,Oralce數據庫的情況,我們只要設計一個界面層和業務邏輯層,就可以實現多個數據訪問層,從而使同一個系統支持多種數據源。
[業務邏輯層(BLL)][IDAL][DALFacotry][數據訪問層
(DAL)][SQLServerDAL
SqlConnection等][AccessDAL
OleDbConnection等] [SQL Server
數據庫] [Access
數據庫][界面層(UI)]
圖2 修改后的三層架構
2.1 數據訪問層接口
.NET中的接口提供一組公共方法和屬性,不需要具體實現,只是告訴繼承它的類至少要實現哪些功能,繼承它的類可以增加自己的方法。如果增加不同數據源,只需要在數據訪問層增加一個類即可,不會影響界面層和業務邏輯層,這對系統的擴展有極大的用處。
圖2中IDAL是數據訪問層接口,這樣做的好處是使業務邏輯層調用數據訪問層接口即可實現數據庫的增刪改等操作。業務邏輯層與數據訪問層是一種抽象依賴的關系,而非具體依賴,以教學資源庫系統的新聞為例,在該接口中有增加、刪除、修改數據庫的三個方法,特定的實現由具體數據庫類完成。
namespace TeachRes.IDAL
{ public interface INews
{ bool addNews(News New);
bool delNews(int NewsID);
bool updateNews(News New);
}
}
2.2 簡單工廠模式和反射機制
簡單工廠模式屬于創建型模式[1,2],又叫做靜態工廠方法(Static Factory Method)模式,是由一個工廠對象決定創建出哪一種產品類的實例。圖2中DALFactory是簡單工廠類,基本思想是讓業務邏輯層(BLL)僅僅知道工廠類, 并把產品以接口形式返回給業務邏輯層, 把對象的創建細節對業務邏輯層完全屏蔽。在該類中根據用戶配置返回數據庫的類名,通過類反射創建出類的實例。
反射[3]是在運行時動態分析、操縱和創建對象的機制,它是一種動態實例化類型的語言機制,利用反射實現動態類型實例化的關鍵在于獲得類型名稱。類型是程序集(Assembly)的一部分,因此完整的類型名稱不僅要有類所在名稱空間、類名,還要有所在程序集的名稱。通過反射機制可以得到一個給定程序集的所有類型列表。
以教學資源庫系統為例[4],編碼如下。
public sealed class DALFactory
{ //從Web.Config中讀取需要連接的數據源,可在Web.Config配
置多個,在這里動態切換
private static readonly string path=System.Configuration
.ConfigurationManager.AppSettings["WebDAL"];
//創建數據訪問類 并以接口的形式返回:INews
public static INews createINews()
{ string classname="TeachRes."+path+".NewsDAL";
return (INews)Assembly.Load(path)
.CreateInstance(classname);
}
}
2.3 可以根據需要創建多個數據訪問層,這里假設有兩個分別支持SQL Server和Access
⑴ 訪問SQL Server數據庫
namespace TeachRes.SQLServerDAL
{ public class NewsDAL:INews
{ public bool addNews(News New)
{ //SQL實現,訪問SQL Server數據庫
}
}
}
⑵ 訪問Access數據庫
namespace TeachRes.AccessDAL
{ public class NewsDAL:INews
{ public bool addNews(News New)
{ //OLEDB實現,訪問access數據庫
}
}
}
2.4 業務邏輯層訪問方式
namespace TeachRes.BLL
{ public class BNews
{ private INews iNews=null;
public BNews()
{ iNews=DALFactory.createINews();
}
public bool addNews(News New)
{ return iNews.addNews(New);
}
}
}
3 結束語
本文在經典的三層架構基礎上,提出了三層架構+簡單工廠模式+反射機制的方式開發應用程序。利用改進的三層架構可以在不改變界面層和業務邏輯層的情況下,實現多數據源的訪問或切換。本解決方案的提出將有利于應用程序的進一步擴展,可實現代碼的復用。同時本文以教學資源庫系統的開發為例給出了核心實現方式,這對其他復雜系統的開發有極大的借鑒意義。
參考文獻:
[1] James W. Cooper.C#設計模式[M].電子工業出版社,2011.
[2] Alan Shalloway James R. Trott.Design Patterns Explained[M].中國
電力出版社,2001.
[3] Robert C. Martin.敏捷軟件開發-原則、模式與實踐[M].清華大學出
版社,2003.
[4] Don Box, Chris Sells. .NET本質論 第1卷:公共語言運行庫[M].中國
電力出版社,2004.
[5] 高雅俠,鄒海榮.計算機網絡教學平臺的開發與設計[J].計算機時代,
2012.8:13-15