擁有自己的代碼生成器—Newlife.XCode模板編寫教程


        本博客所有文章分類的總目錄:http://www.cnblogs.com/asxinyu/p/4288836.html

Newlife XCode組件相關文章目錄:http://www.cnblogs.com/asxinyu/p/4329747.html

  上一篇擁有自己的代碼生成器—NewLife.XCode代碼生成器分析簡單的分析了Xcoder的原理,並通過快速調用模板引擎生成了代碼,對調用引擎前后的注意事項也說了一下,本篇主要來介紹模板的編寫及規則。上一篇已經貼出了 生成的代碼,當然這個代碼也是你編寫模板之前需要考慮的,的確是要生成這個樣子,然后才能去編寫對應的模板。關於模板引擎的說明,Newlife團隊的大石頭有一篇博客很經典,大家可以去參考一下,  模版引擎XTemplate與代碼生成器XCoder(源碼) 理論性比較強一點,我只是實際操作一下。
一、先來說說模板引擎的編譯過程,下面是引用石頭的總結啊:
編譯型模版引擎的處理過程:
1,Process。采用正則分析模版語法,識別出來指令、代碼、表達式、普通文本
2,GenerateCode。根據分析結果,為每一個模板項(一個模板文件就是一個模板項)生成一個C#類,這里得出每個模板項是否被包含過,被包含過的模板項不會生成最終的C#類,僅用於被包含
3,Compile。調用C#編譯器編譯各個C#類,形成一個程序集,如果打開調試,會在臨時目錄XTemp保存一份dll,如果編譯出錯,臨時目錄還會有生成的各個C#類文件,方便差錯
4,Render。經過編譯,模版引擎已經准備就緒。調用某一個模板生成代碼,實際上就是找到相應模板生成的Type,然后創建一個實例。這個實例自然繼承自TemplateBase。然后傳入參數,最后調用Render方法。Render的返回值,就是字符串結果。模板生成的代碼里面,幾乎全部在Render方法里面,里面主要就是一個StringBuilder,不斷的拼接各項內容。
編譯型模版引擎,分析、生成模版代碼、編譯,這是一個非常耗時的過程,所以不能重復。
XTemplate有完備的緩存機制,保證只會編譯一次,然后每次Render就是標准的C#代碼執行,擁有超越所有非編譯型模版引擎的性能。

二、再說說模板的語法,其實這個語法其實比較通用,也挺簡單,只有關鍵的幾點,但是背后的實現可能就不那么簡單:
1、模板是完全使用C#作為模版語言,把<##>標簽外的文本內容當作字符串原樣輸出,而把<##>標簽內作為C#代碼執行,因此很容易理解。
2、模板引擎中獲取的數據值,傳入的Data是一個字典集合,可以根據名稱訪問,任何獲取變量值都要用 <#=  #>,例如<#= Data["NameSpace"]#>,獲取字典中key為NameSpace的值,用來作為命名空間。<#= #>同樣可以用來獲取在模板中定義的的變量值。
3、模板中變量的定義是在<# #>里面定義的,不要=號,定義的時候可以使用<#=#>來替代部分值。如
< # string title = <#=Data["Title"]#>Name#>,這里組合一個字符串,可以在下面調用<#=Title#>
3.另外模板中需要的循環等都要在<# #>里面,其他所有在<# #>都會原樣輸出。
4.可以看到整個模板中就是這2個東西<##>和<#= #>,他們是關鍵,雖然沒什么難度,但出錯了,的確比較麻煩,很難改,當然模板引擎有調試功能,當然多寫多改,就經驗就好辦了。下面來分析一段簡單的模板,就是字段定義的,根據Data是一個鍵值對集合,來生成字段定義,鍵值對中Key是字段名稱,value是字段類型。Data集合中還有2個其他的字段,不能包括在里面,那就是NameSpace和ClassName,所以生成字段的時候要把這2個排除在外,所以下面的循環中有一個判斷。
 

View Code
 1  namespace <#=Data[ " NameSpace "]#>
 2 {
 3      public  class <#=Data[ " ClassName "]#>:WMIBase
 4     {
 5          #region 字段定義
 6         <#  foreach(KeyValuePair< string, object> item  in Data)
 7         { if((!item.Key.Contains( " NameSpace "))||(!item.Key.Contains( " ClassName ")))
 8         {#>
 9          private <#=item.Value#> _<#=item.Key.ToLower()#> ;
10        <#}
11         }#>
12          private ManagementObject _mo;
13          #endregion

 上述代碼生成的就是字段定義,可以對比上一篇博客中生成的代碼,就是循環拼接的過程。

當然模板引擎還有一個強大的功能,那就是調試,可以發現一些潛在的錯誤,使得更容易發現和修改錯誤。為了說明上面那段代碼,我准備了一張說明的圖,嘿嘿,理解不了,就多動手做一些簡單的,就知道了,熟能生巧嗎。先看模板說明和生產代碼說明對比:  

看看對應生成的代碼

 

至於傳入的數據已經在上一篇擁有自己的代碼生成器—NewLife.XCode代碼生成器分析中提到了,過程應該比較清楚吧。有什么問題,可以提出來,大家交流交流。 

新生命開發團隊的相關信息,QQ群:1600800
博客:http://nnhy.cnblogs.com
論壇:http://www.53wb.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM