在Winform開發框架的應用中,大多數的時候,我們都是采用固定的表名作為操作數據表的對象,但有時候,有些特殊的需要,需要動態指定表的名稱,如表名稱可能和年份有關系或者和登錄用戶的身份有關系等等。本文介紹基於我的Winform開發框架,介紹如何動態構造表名,實現向不同表獲取數據的操作實現。
例如:數據庫中有一些客戶信息的表(Customer),按照年份存儲,都是Customer2012這樣格式的表,每次調用的時候需要告訴Customer業務對象實際上去訪問哪個Customer的表,比如Customer2012或者Customer2013,那么我們應該如何操作才能達到這種效果呢?
首先我們來了解下整個Winform開發框架的分層布局如下所示。其中界面層UI直接訪問BLL層,不需要通過網絡(WCF開發框架通過網絡訪問數據),其中公用輔助類庫Common層、實體類層可以在各個層中訪問,並把常用的權限管理、字典管理封裝為組件模塊,直接調用,底層則使用工廠方式,來支持各種不同的數據庫,其中UI層、BLL層、DAL層、實體層均使用繼承類方式實現最良好的封裝、最優的代碼設計。

業務訪問層的設計圖如下所示。

數據訪問層的設計如下所示。

由於基類的封裝良好性,以及利用泛型獲得強類型的操作體驗,減少出錯,更加方便易用,在擴展上也更加高效快捷。
綜上所述,為了實現動態表名的操作,我們只需要擴展三個類即可實現,第一個是BaseBLL業務層基類,提供給接口給界面進行調用;第二個是IBaseDAL,提供數據訪問層接口進行調用,第三個是在AbstractBaseDAL基類中實現修改數據表的接口即可。下面我們來看具體的代碼分析。
1)在BaseBLL增加InitTableName函數的實現。
public class BaseBLL<T> where T : BaseEntity, new() { #region 構造函數 private string dalName = ""; protected IBaseDAL<T> baseDal = null; public BaseBLL() : this("") { } public BaseBLL(string dalName) { ....................... baseDal = Reflect<IBaseDAL<T>>.Create(this.dalName, Assembly.GetExecutingAssembly().GetName().Name); } #endregion /// <summary> /// 初始化數據庫表名 /// </summary> /// <param name="tableName">數據庫表名</param> public void InitTableName(string tableName) { baseDal.InitTableName(tableName); } }
2)在IBaseDAL中增加接口定義
/// <summary> /// 數據訪問層接口 /// </summary> public interface IBaseDAL<T> where T : BaseEntity { //其他接口定義 ............................. /// <summary> /// 初始化數據庫表名 /// </summary> /// <param name="tableName">數據庫表名</param> void InitTableName(string tableName); }
3)在AbstractBaseDAL數據訪問基類中實現InitTableName接口。
/// <summary> /// 數據訪問層的基類 /// </summary> public abstract class AbstractBaseDAL<T> where T : BaseEntity, new() { protected string tableName;//需要初始化的對象表名 protected string primaryKey;//數據庫的主鍵字段名 protected string sortField;//排序字段 public AbstractBaseDAL() {} /// <summary> /// 指定表名以及主鍵,對基類進構造 /// </summary> /// <param name="tableName">表名</param> /// <param name="primaryKey">表主鍵</param> public AbstractBaseDAL(string tableName, string primaryKey) { this.tableName = tableName; this.primaryKey = primaryKey; this.sortField = primaryKey;//默認為主鍵排序 } //省略其他代碼 .............................. /// <summary> /// 初始化數據庫表名 /// </summary> /// <param name="tableName">數據庫表名</param> public void InitTableName(string tableName) { this.tableName = tableName; } }
4)界面層調用代碼
以數據字典操作為例,我們動態指定表名可以調用下面代碼,如下所示。
private void btnTest_Click(object sender, EventArgs e) { BLLFactory<DictType>.Instance.InitTableName("tb_DictType"); List<DictTypeInfo> list = BLLFactory<DictType>.Instance.GetAll(); }
以上就是動態表名在我的WInform開發框架中的實現擴展,雖然這個實現不算復雜,但是可以從中了解Winform開發框架的業務對象的調用過程,以及看到基類對象擴展的方便性和高效性。
由於底層的對象良好封裝,在我們實際開發過程中,大多數情況下,不用編寫額外的數據訪問代碼,對於界面及整體框架的代碼,也有代碼生成工具Database2Sharp能夠實現快速的框架代碼以及界面代碼(包括Winform、Web界面代碼)的生成,以此從根本上提高開發的效率,減少出錯的機會,統一整體框架的代碼風格,實現更加健壯的開發應用。
