承接上篇《數據庫設計與框架生成》,本文深入剖析生成專案的核心代碼結構:IDAL 接口層 → DALSQL 實現層 → BLL 業務層 的泛型協作機制、反射工廠創建流程、多庫動態切換原理,助你從「會用」進階到「懂原理、能擴展」。
namespace WHC.TestProject.IDAL {
public interface ICustomer : IBaseDAL<CustomerInfo> { }
}
IBaseDAL<T> 封裝增刪改查、分頁、條件查詢等標準接口,泛型強類型避免拆箱裝箱與拼寫錯誤。ICustomer 僅在標準接口不足時添加業務專屬方法。

namespace WHC.TestProject.DALSQL {
public class Customer : BaseDALSQL<CustomerInfo>, ICustomer { }
}
BaseDALSQL<T> → AbstractBaseDAL (超級基類,含通用 ADO.NET 邏輯)WHC.Framework.ControlUtil 獨立類庫,避免重複生成與版本衝突

實體↔資料庫映射由代碼生成器自動產出兩核心方法:
protected override CustomerInfo DataReaderToEntity(IDataReader dr) {
var r = new SmartDataReader(dr);
return new CustomerInfo {
ID = r.GetString("ID"), Name = r.GetString("Name"), Age = r.GetInt32("Age"),
Creator = r.GetString("Creator"), CreateTime = r.GetDateTime("CreateTime")
};
}
protected override Hashtable GetHashByEntity(CustomerInfo obj) {
return new Hashtable {
{"ID", obj.ID}, {"Name", obj.Name}, {"Age", obj.Age},
{"Creator", obj.Creator}, {"CreateTime", obj.CreateTime}
};
}
public class Customer : BaseBLL<CustomerInfo> {
public Customer() : base() {
base.Init(this.GetType().FullName, Assembly.GetExecutingAssembly().GetName().Name);
}
}
BaseBLL.Init 核心邏輯:讀取 ComponentDbType 設定 → 決定 DAL 前綴 (DALSQL./DALOracle./DALSQLite....) → 替換命名空間 → 反射創建 DAL 實例並轉為 IBaseDAL<T>:
string dbType = config.AppConfigGet("ComponentDbType") ?? "sqlserver";
string DALPrefix = dbType switch {
"sqlserver" => "DALSQL.", "oracle" => "DALOracle.", "sqlite" => "DALSQLite.",
"mysql" => "DALMySql.", "access" => "DALAccess.", _ => "DALSQL."
};
this.dalName = bllFullName.Replace("BLL.", DALPrefix);
baseDal = Reflect<IBaseDAL<T>>.Create(this.dalName, dalAssemblyName);
public class BLLFactory<T> where T : class {
private static Hashtable objCache = new Hashtable();
public static T Instance {
get {
var key = typeof(T).FullName;
if (objCache[key] is T cached) return cached;
lock (syncRoot) {
if (objCache[key] == null) {
var inst = Reflect<T>.Create(typeof(T).FullName, typeof(T).Assembly.GetName().Name);
objCache[key] = inst;
}
return (T)objCache[key];
}
}
}
}
使用範例:
var info = BLLFactory<User>.Instance.FindByID(id); info = SetUserInfo(info); BLLFactory<User>.Instance.Update(info, info.ID);
此架構實現:介面編程、強類型、單例快取、配置驅動多庫、反射解耦 五大核心特性,是 Winform 框架穩定高效的基石。