受到群裡兄弟們的竭力邀請,老陳終於決定來分享一下.NET下的模板引擎開發技術。本系列文章將會帶您由淺入深的全面認識模板引擎的概念、設計、分析和實戰應用,一步一步的帶您開發出完全屬於自己的模板引擎。關於模板引擎的概念,我去年在百度百科上錄入了自己的解釋(請參考:模板引擎)。老陳曾經自己開發了一套網鳥Asp.Net模板引擎,雖然我自己並不樂意去推廣它,但這已經無法阻擋群友的喜愛了!
最初的模板引擎是為了實現商務邏輯和代碼分離,後來發現這樣的模式給介面維護帶來了極大的便利,這也是一種MVC模式的實現。現在我們在很多地方都可以看到模板引擎的身影,比如各種CMS、論壇、代碼產生器,甚至是Mootools、JQuery等JavaScript庫都用到了模板引擎。那麼模板引擎到底是個什麼東東呢?模板引擎在實際生產環境中有著什麼樣的意義?我們到底是否應該使用模板引擎技術?接下來我們會一一解答。
模板引擎是什嗎?
模板引擎是以商務邏輯層和表現層分離為目的的,將規定格式的模板代碼轉換為業務資料的演算法實現。它可以是一個過程代碼、一個類,甚至是一個類庫。不同的模板引擎其功用也不盡相同,但其基本原理都差不多。
模板引擎的基本機理就是替換(轉換),將指定的標籤轉換為需要的業務資料;將指定的偽語句按照某種流程來變換輸出。最低限度的模板引擎就類似於如下代碼的實現:
1 const string message = "{Person}喜歡{Color}";
2
3 var msg = message.Replage("{Person}", person).Replage("{Color}", color);
實際上,我們在開發過程中已經在很多地方不自覺的在使用模板機制了。只不過對於如上的代碼,在C#裡面有更好的String.Format()可以使用,它自身也是實現了一套模板引擎。
按照具體的實現方式,我將模板引擎分成了三個基本類型:
- 置換型模板引擎。置換就是將規定好的文本標記替換為目標內容。這種模板引擎實現簡單,除了標籤替換之外,很少支援諸如子模板引用、流程式控制制等。正如上面所說,我們幾乎天天都在使用這種模板引擎。置換型模板引擎通常用於商務邏輯不是很複雜的項目,比如產生簡訊、產生電子郵件,甚至有很多代碼產生器也在用它。可以說,置換型模板引擎的思想是整個模板引擎界的基礎。
- 解釋型模板引擎。解釋型模板引擎的原理還是標記置換。只不過有瞭解釋器的存在,可以支援更加複雜的標記和文法。後面我們將會介紹一種使用反射機制實現的非常好用的模板引擎。大家都知道,在程式設計語言中,解釋型語言和編譯型語言相比行嫩會差出很多,這主要得看解譯器如何最佳化了。
- 編譯型模板引擎。編譯型模板引擎是相對於解釋型模板引擎來說的,實際上定名為編譯型模板引擎也不太合適,但我也沒想到別的好名字,哈!我們將要介紹的編譯型模板引擎是Asp.Net網站開發專用的。它通過解析引擎和一系列的演算法將我們定義的模板轉換為.aspx檔案,然後直接存取.aspx檔案即可。
模板引擎的應用
在很多時候,模板引擎都是為了實現商務邏輯層和表現層的代碼分離,以便於協同開發的。然而也有很多應用不僅如此,比如代碼產生器,這裡的代碼分離實際上是為了能夠獲得更好的可擴充性。
題外話:在早期,.NET推崇的Web開發模式就只有WebForm,這種模式是讓很多高手都望塵莫及且避夷所思的。我個人是從Asp/PHP轉移到.NET的,在Asp時代我就開發過自己的模板引擎,PHP環境就更不用說了,開源的帶有模板引擎的架構一大把。可以說,除了做.NET的,其他陣營的猴子們其實對於模板引擎一點兒也不陌生。後來,微軟推出了MVC架構,我也曾經看過它的實現,基本思想就是把當年的Asp編碼方式又給拿了回來而已,在很多地方還是不夠方便。我還是堅持了模板引擎的使用。
模板引擎可以實現代碼分離,讓開發人員各司其職,它也是幾乎所有代碼產生器的基礎組件之一,有了模板引擎,在表現層和最終業務資料上,我們可以擁有更好的可擴充性。
比較好的模板引擎實現,比如老陳的“網鳥Asp.Net模板引擎”,還可以內建模板代碼重用、多語言支援、動態網頁面與靜態頁面自動均衡等功能。
小結
本文簡單的闡述了模板引擎的概念極其用途,從下一篇文章開始,我們將深入探討實現各種模板引擎所需要用到的開發技術和演算法。
由於本系列文章在編寫之時並沒有系統的規劃,因此可能會在適當的時候增刪章節。總而言之,模板引擎看似是一個小東西,但要真正從頭做起來,卻又會顯得相當複雜而龐大。各位朋友要做好心理準備!我也盡量從簡介紹。