天天看點

Winform開發架構之資料通路層的設計

我在前面幾篇介紹過我的Winform開發架構的相關内容,其中主要集中在界面展現以及各層的總體設計上,還沒有空來得及深入進行各個重要細節的講解,今天我們來介紹、讨論下我的Winform開發架構之資料通路層的設計方面的知識,希望對大家有所幫助。

前面介紹過,該Winform開發架構支援多種資料庫的通路,隻需要對配置進行修改即可切換,如下圖所示。

其中我們可以看到,裡面有幾種資料通路層的相關資料,大緻知道是通過同一的IDAL資料通路層接口派生出幾個對應不同資料庫的操作層,由業務邏輯層BLL進行相應的調用,但是具體細節從上圖并不能了解到。

其實他們的大緻關系如下圖所示。 

首先BLL層,通過BLLFactory對象,根據配置資訊,執行個體化不同的業務通路對象,轉換為資料通路層接口進行調用的,BLLFactory通過反射間接方式,建構出不同資料庫對象的資料通路層,而資料通路對象,他們都內建了基類BaseDAL,這個基類封裝類了絕大多數的增删改查等基礎性操作,并通過高度抽象,隻需要繼承該基類的子類重載部分函數即可完成較為豐富的操作實作。具體的繼承關系如下圖所示。

由于每個不同資料庫都需要擁有一個BaseDAL,那麼很多相同的操作代碼就會發生備援,因為大多數資料庫的基礎操作是一樣的,隻有一部分比較特别,需要進行個性化處理,是以對以上的資料通路層進行優化設計,得到下面的設計圖,如下所示。

由于把BaseDAL層的通用操作,進一步提升抽象到AbstractBaseDAL 類裡面進行管理,是以,BaseDAL雖然在各種資料庫的資料通路層中存在,但是,卻隻是需要實作很少的代碼,如下所示。

因為不同的資料庫,FindFirst(查找第一條)、FindLast(查找最後一條)、Insert2(插入記錄後,傳回新增的主鍵值)、以及分頁查詢FindToDataTable、FindWithPager等不同。是以資料通路層的BaseDAL子類需要覆寫基類AbstractBaseDAL的這些實作。

通過實作部分個性化資料庫操作的函數及強大的基類

AbstractBaseDAL實作,我們可以看到,整個資料通路層基類得到非常強大的操作功能,如下所示。

為了說明問題,我列舉幾個上面函數不同的實作給讀者,以便說明問題。

1)SqlServer的FindFirst語句如下:

            string sql = string.Format("Select top 1 {0} From {1} Order by {2} ASC", selectedFields, tableName, GetSafeFileName(sortField));

2)Oracle的FindFirst語句如下:

  string sql = string.Format(@"Select * from (Select {0} From {1} Order by {2} ASC)   WHERE ROWNUM <= 1 ORDER BY ROWNUM ASC", selectedFields, tableName, GetSafeFileName(sortField)); 

3)Sqlite的FindFirst語句如下:  

  string sql = string.Format("Select {0} From {1} Order by {2} ASC LIMIT 1", selectedFields, tableName, GetSafeFileName(sortField)); 

為了實作功能強大的資料通路基類,并盡可能減少重複代碼,高度提煉基類是很有效的方法。适當的內建關系,使得代碼量更少,擴充更加容易,這個就是我的Winform架構的優化思想。

本文轉自部落格園伍華聰的部落格,原文連結:Winform開發架構之資料通路層的設計,如需轉載請自行聯系原部落客。