首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C#發現之旅第十二講:基於反射與動態編譯的快速ORM框架(上)第6部分

     編輯:關於C語言

實體類型註冊與驗證機制

在快速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 輸出單行程式碼,使產出的原始碼易於除錯與維護。

GenerateCode 方法流程

完整代碼生成邏輯集中於 MyFastORMFramework.GenerateCode:建立輸出器 → 輸入命名空間與必要 using → 遍歷實體類型清單 → 對每個類型產出繼承 RecordORMHelper 的具體類別 → 依序生成 TableName、RecordFieldNames、FillUpdateCommand、FillDeleteCommand、FillInsertCommand、InnerReadRecord 等方法覆寫碼 → 可選存檔 → 回傳完整原始碼字串。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved