程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第十二講 基於反射和動態編譯的快速ORM框架(上)(6)

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

編輯:關於C語言

這個過程很簡單,就是向該列表 的鍵值列表添加實體對象類型,這裡調用了GetBindProperties函數,該函數內部會仔細檢查 實體對象類型是否符合快速ORM框架的要求,若不符合則會報錯,因此這裡調用 GetBindPropertIEs函數就是檢查實體對象類型是否合格。

ORM框架操作數據庫前都會 查詢實體類型注冊列表獲得所需的數據庫操作幫助器,也就是調用函數GetHelepr,其代碼為

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 ;
}

在這個函數中, 參數就是實體對象類型,首先從注冊列表中獲得數據庫操作幫助器,若沒有找到則進行注冊 ,然後調用BuildHelpers執行動態編譯生成數據庫操作幫助器。然後再嘗試從注冊列表中獲 得數據庫操作幫助器。

在ORM框架中,GetHelper函數會頻繁的調用,因此使用實體對 象類型注冊列表可以提高系統性能。應用系統多次連續的調用RegisterType函數會導致類型 注冊列表中有多個類型對應的數據庫操作幫助器是空的,而再BuildHelpers函數內部會對所 有的沒有設定數據庫操作幫助器的實體對象類型執行動態編譯的操作,能一下子生成多個數 據庫操作幫助器,這樣能盡量減少動態編譯的次數。

代碼生成器

在動態編譯 框架中,代碼生成器是非常重要的部分。沒有代碼生成器,動態編譯框架成了無源之水,無 米之炊了。代碼生成器的主要工作就是使用反射解析數據庫實體類的結構,分析其中的數據 庫綁定信息,然後使用字符串拼湊的操作來生成C#代碼字符串。

要設計出代碼生成器 ,首先的設計出其要輸出的C#代碼的結構,我們可以不使用那個基礎的RecordORMHelper而完 全依賴生成的C#代碼來完成數據庫的映射功能,不過即使用代碼生成器,我們也得考慮到代 碼的重用,於是我們把一些通用的代碼放到RecordORMHelper中,然後動態生成的C#類就繼承 自RecordORMHelper。

ORM框架中還包含了一個IndentTextWriter的支持縮進的文本書 寫器,雖然我們可以完全使用字符串加號操作來生成代碼文本,但使用IndentTextWriter能 讓工作更高效,生成的代碼也便於人們閱讀,這有利於代碼生成器的調試和維護。在 IndentTextWriter中,使用BeginGroup來開始縮進一段代碼塊,使用EndGroup來結束縮進一 段代碼塊,使用WriteLine來輸出一行代碼文本。

在快速ORM框架中,代碼生成器包含 在函數MyFastORMFramework.GenerateCode中。現對其過程進行說明

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved