模版引擎XTemplate與代碼產生器XCode是本文要介紹的內容,主要是來學習模版引擎XTemplate是一個仿T4設計的引擎,功能上基本與T4一致模版文法上完全相容T4,模版頭指令部分相容)。
自己設計模版引擎,就是為了代碼產生器、網站模版、郵件模版等多種場合,也就是要能拿出來單獨使用、功能強大並且容易控制的。T4是個很好的引擎,但是它的設計基本上傾向於vs,幾乎不顧別的場合。
XTemplate特點如下:
1、完全使用C#作為模版語言。跟ASP、ASP.Net頁面的解析一樣,把<##>標籤外的常值內容當作字串,用一個StringBuilder,標籤內作為C#原生代碼,拼在一起編譯,進行模版替換時,實質上就是執行編譯後的程式集,這就是XTemplate的核心原理!網路上現有的許許多多模版引擎,要麼採用標籤替換,要麼自創模版語言,這些都增加了使用者的學習難度。XTemplate使用C#作為模版語言,這個世界安靜了!
2、支援“調試”。不是運行時調試,而是XTemplate能夠把模版編譯的中間類檔案以及程式集等輸出,方便檢查錯誤。如果把模版編譯後的程式集儲存下來,可以在沒有模版檔案的情況下直接使用模版功能。
3、不需要ASP.Net支援。有部分模版引擎,是類比一個ASP.Net伺服器,然後以ASP.Net作為模版來實現,這就要求有一個ASP.Net伺服器作為宿主,限制了模版引擎的使用範圍。
4、支援批量編譯。可以把多個模版放入模版處理器,進行一次編譯所有模版類都編譯到一個程式集裡面去)。
5、支援類成員。模版內容預設情況下將會統一編譯到一個類的Render方法裡面去,但是有時候我們需要給這個類增加一些屬性和方法,此時可以使用<#! #>標籤,序數為單數表示開始,序數為偶數表示結束,所以不限制類成員代碼的位置T4要求只能寫在模版的最後面)。
6、支援自訂基類。預設情況下,所有編譯產生的模版類都繼承自TemplateBase,你也可以建立自己的模版基類,然後在模版頭通過指令,或者通過外部宿主指定自訂的模版基類,模版中可以直接使用自訂模版基類的成員因為繼承嘛),比如代碼產生器XCode中的XCodeBase。
7、自動引用宿主程式集。T4在使用上最大的麻煩就是引用外部程式集和命名空間,畢竟不是在vs裡面編寫C#代碼。XTemplate在編譯的時候,自動引用宿主就是調用者,比如XCode)的所有應用程式集,同時引用大部分常用的明明空間,因為這樣,產生的類很臃腫,但是編譯的時候,編譯器會自動去掉無用的引用。XTemplate從完成到現在為止,還沒有用過引用程式集和命名空間的問題,因為一般來說,模版中需要用到的程式集,宿主裡面一般都有用到,非常符合我們的使用習慣。
8、與宿主的良好互動。在XTemplate中,編譯的模版程式集是直接載入在預設域,這點與T4不同,T4會建立一個域,應該是為了防止模版代碼弄髒預設域的資料吧比如幹擾vs運行)。因為在同一個域,XTemplate與宿主進行互動,就不需要“***”跨域)了。XTemplate的處理過程分為分析、編譯和執行三步,都可以由外部控制,比如有時候我們只是需要檢查一下模版的文法,只需要檢查一下模版文法是否正確,這個時候編譯一下就可以了。
9、更多的特點需要大家來發現!
XCode使用XTemplate代碼後面有XCode的項目代碼):
- Dictionary<String, Object> data = new Dictionary<string, object>();
- data["Config"] = Config;
- data["Tables"] = Tables;
- data["Table"] = table;
-
- // 聲明模版引擎
- Template tt = new Template();
- Template.Debug = Config.Debug;
- foreach (String item in ss)
- {
- if (item.EndsWith("scc", StringComparison.Ordinal)) continue;
-
- String tempFile = item;
- if (!Path.IsPathRooted(tempFile) && !tempFile.StartsWith(TemplatePath, StringComparison.OrdinalIgnoreCase))
- tempFile = Path.Combine(TemplatePath, tempFile);
-
- String content = File.ReadAllText(tempFile);
-
- // 添加檔案頭
- if (Config.UseHeadTemplate && !String.IsNullOrEmpty(Config.HeadTemplate))
- content = Config.HeadTemplate + content;
-
- tt.AddTemplateItem(item, content);
- }
- tt.Process();
-
- // 編譯模版
- tt.Compile();
-
- List<String> rs = new List<string>();
- foreach (String item in ss)
- {
- if (item.EndsWith("scc", StringComparison.Ordinal)) continue;
-
- //String content = RenderFile(table, item, data);
- String content = tt.Render(item, data);
-
- // 計算輸出檔案名
- String fileName = Path.GetFileName(item);
- String className = CutPrefix(table.Name);
- className = FixWord(className);
- String remark = table.Description;
- if (String.IsNullOrEmpty(remark)) remark = ENameToCName(className);
- if (Config.UseCNFileName && !String.IsNullOrEmpty(remark)) className = remark;
- fileNamefileName = fileName.Replace("類名", className).Replace("類說明", remark).Replace("串連名", Config.EntityConnName);
-
- fileName = Path.Combine(OuputPath, fileName);
- File.WriteAllText(fileName, content, Encoding.UTF8);
-
- rs.Add(content);
- }
XTemplate設計圖我喜歡先做圖再編碼)單擊放大:
小結:詳解模版引擎XTemplate與代碼產生器XCode源碼)的內容介紹完了,希望通過本文的學習能對你有所協助!