“與VS集成的若干種代碼生成解決方案”系列[共8篇]

前一陣子寫了不少關於代碼生成相關的文章,介紹了一些如何通過VS自動生成代碼的解決方案,比如CodeDOM、T4以及ASP.NET的BuildProvider等。現在將它們作一個彙總,給廣大讀者作一個參考。

[第1篇] 通過CodeDOM定義生成代碼的結構

我不知道大家對CodeDOM的代碼生成機制是否熟悉,但是有一點可以確定:如果你使用過Visual Studio,你就應該體驗過它帶給我們在編程上的便利。隨便列舉三種典型的代碼生成的場景:在創建強類型DataSet的時候,VS會自動根據Schema生成相應的C#或者VB.NET代碼;當我們編輯Resource文件的時候,相應的的後臺代碼也會自動生成;當我們通過添加Web Reference調用Web Service或者WCF Service的時候,VS會自動生成服務代理的代碼和相應的配置。總的來說,通過和VS集成的動態代碼生成工具使我們可以“強類型”的方式進行編程,進而提供我們的效率並減低錯誤的機率。

CodeDOM 提供了表示許多常見的源代碼元素類型的類型。您可以設計一個生成源代碼模型的程序,使用CodeDOM 元素構成一個對象圖。而這個對象圖包含C#或者VB.NET代碼包含的基本元素:命名空間、類型、類型成員(方法、屬性、構造函數、事件等),並且包括方法實現的具體語句(Statement)。也就是說它的結構就是對一個具體.vb或者.cs文件代碼的反映。在這裏我不會具體介紹CodeDOM體系結構……[閱讀全文]

[第2篇] 通過Visual Studio的Custom Tool定義代碼生成器

在《前篇》中我們已經通過CodeDOM的形式定義了將要生成的代碼結構,而這個CodeDOM對象就是CodeCompileUnitCodeCompileUnit本身是與編程語言無關的,我們可以利用基於某種編程語言(VB.NET或者C#)的CodeDomProviderCodeCompileUnit對象轉換成具體的代碼文本。爲了讓我們的VS自動地爲我們生成代碼,我們需要以Custom Tool的形式編寫相應的代碼生成器。我們編寫的代碼生成器最終通過COM組件的形式對外提供服務,所以其中涉及到COM組件的註冊。爲了實現同VS的集成,還涉及到相應註冊表設置……[閱讀全文]

[第3篇] 不同於CodeDOM的代碼生成機制——T4

前面兩篇介紹瞭如何通過CodeDOM+Custom Tool的代碼生成方式實現了代碼的自動生成。實際上,我們最常用的代碼生成當時不是CodeDOM,而是T4,這是一個更爲強大,並且適用範圍更廣的代碼生成技術。T4是對“Text Template Transformation Toolkit”(4個T)的簡稱。T4直接包含在VS2008和VS2010中,是一個基於文本文件轉換的工具包。T4的核心是一個基於“文本模板”的轉換引擎,我們可以通過它生成一切類型的文本型文件,比如我們常用的代碼文件類型包括:C#、VB.NET、T-SQL、XML甚至是配置文件等。

對於需要通過T4來進行代碼生成工作的我們來說,需要做的僅僅是根據轉換源(Transformation Source),比如數據表、XML等(由於例子簡單,HelloWord模板沒有輸入源)和目標文本(比如最終需要的C#或者T-SQL代碼等)定義相應的模板。T4模板作用就相當於進行XML轉化過程中使用的XSLT。

T4模板的定義非常簡單,整個模板的內容包括兩種形式:靜態形式和動態動態。前者就是直接寫在模板中作爲原樣輸出的文本,後者是基於某種語言編寫代碼,T4引擎會動態執行它們。這和我們通過內聯的方式編寫的ASP.NET頁面很相似:HTML是靜態的,以C#或者VB.NET代碼便寫的動態執行的代碼通過相應的標籤內嵌其中。[閱讀全文]

[第4篇] 通過T4模板實現單文件的代碼生成

在《前一篇》中,我對T4模板的組成結構、語法,以及T4引擎的工作原理進行了大體的介紹,並且編寫了一個T4模板實現瞭如何將一個XML轉變成C#代碼。爲了讓由此需求的讀者對T4有更深的瞭解,我們通過T4來做一些更加實際的事情——SQL Generator。在這裏,我們可以通過SQL Generator爲某個數據表自動生成進行插入、修改和刪除的存儲過程……[閱讀全文]

[第5篇] 通過T4模板實現多文件的代碼生成

在《前一篇》中我們通過T4模板爲我們指定的數據表成功生成了我們需要的用於添加、修改和刪除操作的存儲過程。但是這是一種基於單個文件的解決方案,即我們必須爲每一個生成的存儲過程建立一個模板。如果我們提供一種基於多文件的代碼生成方式,將會爲編程人員帶來極大的便利。藉助於T4 ToolBox這個開源工具箱,多文件的SQL Generator的實現變得異常簡單。[閱讀全文]

[第6篇] 解決T4模板的程序集引用的五種方案

如果你的T4模板需要調用一個自定義的類型,並且該類型定義在某個非系統程序集中,你就需要通過T4<#@ assembly…#>指令引用該程序集。在VS 2008環境下,你只需要爲當前項目添加相應的程序集引用,並且通過<@ assembly…#>指令的name屬性指定程序集(Dll)的文件名即可。但是這種方式對於VS 2010則行不通,因爲T4引擎在解析和編譯模板的時候並不會從項目引用列表中去定位目標程序集。本篇文章爲你介紹在VS2010下5種不同的程序集引用的方式……[ 閱讀全文]

[第7篇] 編寫T4模板進行代碼生成無法避免的兩個話題:"Assembly Locking"&"Debug"

出於提高性能考慮,T4引擎在進行基於代碼生成的模板轉換(Template Transformation)的時候,會始終重用同一個AppDomain。由於該AppDomain不會自動卸載,這就會導致該AppDomain始終鎖定所有被它加載的程序集。如果我們需要釋放程序集,我們不得不重啓VS。但是,對於T4模板的開發調試階段,這種通過重新啓動VS的方式去釋放程序集以確保我們的項目能夠成功編譯是不能接受的。那麼,是否有一種解決方案既能夠確保T4引擎能夠進行正常的模板轉換,又能避免它強行鎖定引用程序集呢?

VS和一些T4編輯器雖然給了基本的智能感知支持,但是在絕大部分我們相當於在編寫純文本的腳本,所以對於一些比較複雜的模板轉換邏輯,我們需要通過Debug的方式去發現一些無法避免的問題……[閱讀全文]

[第8篇] 通過自定義BuildProvider爲ASP.NET提供代碼生成

對於ASP.NET應用的開發者來說,你可能不知道什麼是BuildProvider,但是你幾乎無時無刻不在使用它所帶來的代碼生成機制。當你創建一個.aspx文件的時候,爲什麼會自動創建對應源代碼?當你在該.aspx頁面中以XML的方式添加一個按鈕,源代碼中爲什麼會自動添加一個同名的屬性。實際上,ASP.NET就是通過一個特殊的BuildProvider實現了將.aspx文件內容轉換成相應的源代碼,這個特殊的.aspx文件就是:PageBuildProvider。基於不同的文件類型,ASP.NET會採用不同的BuildProvider進行源代碼的生成。比如UserControlBuildProvider和MasterPageBuildProvider分別實現了基於用戶控件文件(.ascx)和母板頁(.master)的源代碼生成……[閱讀全文]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章