框架核心設計原則:統一調用入口、強類型、單例快取、配置驅動、反射解耦。本文深度剖析 BLLFactory (傳統 Winform) 與 CallerFactory (WCF/混合式) 雙工廠的實現細節、創建鏈路、跨框架遷移規律。
public class BLLFactory<T> where T : class {
private static Hashtable objCache = new Hashtable();
private static object syncRoot = new object();
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];
}
}
}
}

公用類庫定義,所有模塊共享:

public class User : BaseBLL<UserInfo> {
private IUser userDal;
public User() : base() {
base.Init(this.GetType().FullName, Assembly.GetExecutingAssembly().GetName().Name);
this.userDal = (IUser)base.baseDal;
}
}
BaseBLL.Init 讀取配置 ComponentDbType → 確定 DAL 前綴 → 替換命名空間 → 反射創建 DAL 實例 → 轉為 IBaseDAL<T>。調用時:
var info = BLLFactory<User>.Instance.FindByID(id); BLLFactory<User>.Instance.Update(info, info.ID);
適用於 WCF 客戶代理或 BLL 進一步封裝,UI 層調用方式與 BLLFactory 幾乎一致:
var info = CallerFactory<IUserService>.Instance.FindByID(id); CallerFactory<IUserService>.Instance.Update(info, info.ID);

public class CallerFactory<T> {
private static Hashtable objCache = new Hashtable();
private static string callerNamespace = null; // Facade 實現類命名空間
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 = CreateObject(); // 隔離創建邏輯
if (inst != null) objCache[key] = inst;
}
return (T)objCache[key];
}
}
}
private static T CreateObject() {
// 讀取 WCF 配置 → 定位程序集 → 反射創建 Facade 實現類 → 轉為 T
}
}


雙工廠模式是框架「統一性」原則的極致體現,讓開發者專注業務而非基礎設施差異。