在快速ORM框架中,實體類型的註冊過程相當簡潔。系統會將實體對象類型添加至鍵值列表,並同步呼叫 GetBindProperties 函數進行嚴格檢查。該函數會驗證實體類型是否符合框架要求——例如是否標記了必要的 BindTableAttribute 與 BindFieldAttribute 特性——若不符合則立即拋出異常,確保只有合格的實體類型進入處理流程。
ORM 框架在操作資料庫前,會先從實體類型註冊列表中查詢對應的 RecordORMHelper 輔助器。核心邏輯封裝在 GetHelper 方法中:
private RecordORMHelper GetHelper(Type RecordType) {
RecordORMHelper helper = null;
if (myRecordHelpers.ContainsKey(RecordType)) {
helper = (RecordORMHelper)myRecordHelpers[RecordType];
if (helper != null) return helper;
} else {
this.GetBindProperties(RecordType);
myRecordHelpers[RecordType] = null;
}
BuildHelpers(null);
helper = (RecordORMHelper)myRecordHelpers[RecordType];
if (helper == null)
throw new ArgumentException("為類型 " + RecordType.FullName + " 初始化系統錯誤");
return helper;
}
此方法採用「先查緩存、再註冊、後編譯」的三階段策略:優先從哈希表 myRecordHelpers 讀取已編譯的輔助器;若不存在則註冊類型並觸發動態編譯(BuildHelpers);最後再次嘗試獲取,確保輔助器就緒。
由於 GetHelper 在運行期間會被高頻調用,註冊列表緩存機制至關重要。當應用程式連續呼叫 RegisterType 註冊多個實體類型時,對應的輔助器暫時為 null。BuildHelpers 內部會掃描所有未生成輔助器的類型,一次動態編譯產出多個輔助器類別,大幅減少編譯器啟動次數,提升整體效能。
代碼生成器是動態編譯框架的心臟。它利用反射解析實體類結構,提取 BindTableAttribute、BindFieldAttribute 等繫結資訊,透過字串拼接產出 C# 原始碼。為兼顧程式碼重用與靈活性,生成的類別繼承自基礎類別 RecordORMHelper,僅實現抽象方法,共用邏輯保留於基類。
框架內建 IndentTextWriter 輔助生成結構清晰的程式碼。它提供 BeginGroup/EndGroup 控制縮排層級,WriteLine 輸出單行程式碼,使產出的原始碼易於除錯與維護。
完整代碼生成邏輯集中於 MyFastORMFramework.GenerateCode:建立輸出器 → 輸入命名空間與必要 using → 遍歷實體類型清單 → 對每個類型產出繼承 RecordORMHelper 的具體類別 → 依序生成 TableName、RecordFieldNames、FillUpdateCommand、FillDeleteCommand、FillInsertCommand、InnerReadRecord 等方法覆寫碼 → 可選存檔 → 回傳完整原始碼字串。