T4模板~又名基架---一種提升ASP.NET MVC開發速度的強大工具!

来源:http://www.cnblogs.com/gdsblog/archive/2017/06/11/6985067.html
-Advertisement-
Play Games

看過的相當不錯的一篇文章,但是對基架還時不太理解,大神們看到,希望指點一二,能告訴點學習資源就更好了! 本篇文章不是出自本人之手,轉載完全處於膜拜以及學習! 歡迎加我微信:jkxx123321 備註博客加就可以了! 最近由於需要在框架中提供一些自定義模板的功能,找到了一篇博客,可惜似乎是翻譯工具直接 ...


看過的相當不錯的一篇文章,但是對基架還時不太理解,大神們看到,希望指點一二,能告訴點學習資源就更好了!

本篇文章不是出自本人之手,轉載完全處於膜拜以及學習!

歡迎加我微信:jkxx123321 備註博客加就可以了!


 

 

最近由於需要在框架中提供一些自定義模板的功能,找到了一篇博客,可惜似乎是翻譯工具直接翻的,讀不通順,就試著自己翻譯下,我不會完全翻譯原文的句子,可能會對原文進行小範圍的我認為更合適的句子並添加些註釋,,原文地址如下:

http://blogs.msdn.com/b/webdev/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx

 

  在我們最近的博客中提到的ASP.NET MVC Release Candidate中,我們使用了T4 (Text Template Transformation Toolkit)模板來實現了Add Controller和Add View的代碼自動生成功能。我們希望能使用T4給大家帶來開發速度上的提升,因為用戶可以在很大程度上定製這些模板。

 

模板的位置和重寫

 

  Add Controller和Add View都是通過在後臺執行T4模板來實現代碼自動生成的。通過一些工具可以修改模板來定製想要生成的代碼。預設模板的位置在: [Visual Studio Install Directory]\Common7\IDE\ItemTemplates\[CSharp | VisualBasic]\Web\MVC\CodeTemplates\

 

  你也可以把“CodeTemplates”目錄複製到項目的根目錄以便作為每一個項目的基礎在上述位置重寫和定製模板(只需要創建目錄名為“CodeTemplates”的目錄,併在其下創建“AddController”和“AddView”的子目錄即可)。需要預設目錄下有一些模板的重寫可能不起作用,因為自動生成代碼時將會優先選取項目目錄中匹配的模板。還有一個重點需要註意,你可以為Add View功能增加自己的.tt 文件,無論是在公用目錄下還是獨立的項目中,添加後都可以自動的顯示在Add View視窗的視圖選擇的下拉框中。

         另外,複製上述文件夾(添加.tt文件)到項目中時,都會有警告提示,如下圖:

 

(運行這些文本模板可能會對你的電腦產生危害。如果模板來源不可信請不要運行。)

         點擊“Cancel”將不能使用T4模板(如果你複製“CodeTemplates”目錄並增加多個.tt文件時,你都選擇了“Cancel”)。因為一旦項目發現一個.tt文件,文件的“自定義工具(CustomTool①)”屬性將被設置成“TextTemplatingFileGeneraror”,它會通知Visual Studio使用預設的T4宿主(Host②)去執行這個模板並且創建一個基於此模板內容的新的文件(在模板所在的目錄)。

①      :自定義工具是一個實現了 Visual Studio 定義的IVsSingleFileGenerator介面的特殊組件。T4 自定義工具由Microsoft.VisualStudio.TextTemplating.VSHost.TemplatedCodeGenerator類實現並且在註冊表中註冊在Visual Studio 下命名為TextTemplatingFileGenerator。Visual Studio 將使用該名稱查找自定義工具、創建 COM 對象並調用其IVsSingleFileGenerator.Generate 方法

②      :Microsoft.VisualStudio.TextTemplating.VSHost.10.0.dll 的TextTemplatingService服務實現Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost介面,為代碼生成引擎提供 Host (宿主)。在模板轉換過程中: Engine 負責代碼生成;Host負責提供轉換過程中行為具體實現及所需要的的所有外部資源,ITextTemplatingEngineHost和模板內容一起傳遞到Engine.ProcessTempalte方法中用於代碼生成

  

  對於基於模板的一次性文件生成或簡單的使用T4,生成器都可以作為好的的實現方式---但是,因為依賴於自定義模板的宿主的Add View 和Add Controller模板都包含代碼(後面會提到),使用預設的生成器執行模板將會生成錯誤。需要複製模板到項目中之後然後清空自定義工具屬性值。

 

註意:如果你想去掉複製.tt文件時自動設置自定義工具的映射值,你可以通過註冊表實現---註意如果你想要恢復註冊表為預設值,你可以執行Visual Studio的恢復安裝,或手動改回。啟動註冊表編輯器並且找到指定的目錄(根據你的機器選擇是32位還是64位):

32:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Generators

64位:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\Generators

 

展開“Generators”下第一層的每一個節點並找到“.tt”。設置“(Default)”項的值為空,就可以了。

 

如果你想重寫全局模板,並且不想複製“CodeTemplates”目錄到你的項目(大概是你已經有了個同名目錄),你可以通過註冊表修改Add Controller Add View預設的目錄名。啟動註冊表編輯器並且找到指定的目錄(根據你的機器選擇是32位還是64位):

32-bit: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\MVC\CodeTemplates

64-bit: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\MVC\CodeTemplates

 

改變“OverrideDir”項的值為你想要T4工具檢索的目錄名。需要註意的是,新設置的目錄下依然需要保證與原來相同的目錄結構,即包含“AddController”和“AddView”目錄。

 

 

編輯T4模板

         如果你使用Visual Studio打開一個.tt文件,你可能會發現它的內容沒有層次---平鋪在上面。我們強烈推薦你使用T4編輯器,一個Clarius Consulting開發的Visual Studio插件,它可以在你編輯模板時提供語法高亮和一些基本的T4語句的自動完成。有免費的“Community Edition”,以及更強大的“Professional Edition”---如果你有興趣可以比較下不同的特性。下麵你將會看到,這個插件真的讓模板製作有了很大不同。

 

 

 

深入剖析T4模板

  最簡單的學習編輯自定義模板的方法是先看預設模板如何工作。為此,我們通過一些Add View的模板來瞭解“Create”(創建.tt文件)。現在從頭開始:

 

  這四行代碼都是指令。

  1.第一行是模板指令,它的主要作用是通知T4引擎,模板使用哪種語言編寫。這裡所說的模板使用的語言並不是模板會輸出這種語言,而這種語言會控制模板的輸出(例如,模板中可能會報刊一個 if-else語句用來控制哪些文本被輸出)。在使用Add View 或者Add Controller之時,“HostSpecific”屬性需要設置為“True”,否則模板將不能訪問Add View 和Add Controller功能提供的信息(比如將類型綁定為View的強類型,等等)。

  2.緊接著的是輸出指令,它簡單的通過通知模板宿主來設置模板輸出文件的擴展名---這不是MVC特有的工具,因為根據不同情況可能會忽略預設的擴展名(例如,如果我們依賴partial view ,擴展名應該是.ascx)。

  3.接下來的兩行都是引用指令,C#中通常使用“using”,VB中使用“Imports”。如果你在模板中使用了用它們所寫的代碼,你需要在這個位置引用它們。

  你可以在這裡找到更多T4指令的文檔:http://msdn.microsoft.com/en-us/library/bb126421.aspx

  下麵一點,註意一下後面的這行:

 

  這行我們新建了一個變數“mvcHost”,將“Host”轉換類型並賦值給它。因為我們指令中設置了“HostSpecific”屬性為“True”,“Host”被自動提供給模板。MVC工具提供了一個自定義宿主,以便能將信息傳遞給只有工具內部可訪問的模板。為了訪問我們的宿主類中提供的這些屬性,“Host”必須轉換為我們自定義的宿主類型“MvcTextTemplateHost”。

這個變數的使用實際上非常簡單:

 

  首先需要註意的是,‘<#’ 和 ‘#>’標簽之間包含有一些的代碼。這兩個標簽用來調用語句塊和包含控制代碼。你的模板可能要有條件的輸出文本塊到輸出文件中,同時保持其他文本塊的正常輸出。上面,我們有一個if語句(使用C#,因為模板的語言使用模板指令設置成了C#),使用了“{”。這個if語句的“}”出現在後面一些行中的的第17行,在不同的語句塊中。註意,這裡的這個if語句訪問了宿主的“IsViewUserControl”屬性,這個屬性的作用是通知模板用戶選擇的是否是partial view。

  模板中所有這些標記之外的文本塊都會直接輸出到實際的文件中。在上面的截圖中,第14行的文本在標記塊之外,因此會直接輸出---儘管如此,它只會在12行的if語句值判斷為“true”的情況下才會輸出到文件中。

  你可以在這裡瞭解到更多關於T4語句塊的信息:http://msdn.microsoft.com/en-us/library/bb126509.aspx

 

  理解T4模板中控制代碼的最簡單的方法是在大腦中將它連接為一個完整的程式。我們之前在第6行聲明的變數可以被之後的T4控制代碼使用---之後每一個if-else分支條件都可以使用這個變數並且添加一些文本(灰色的)到輸出的文件中。上面的If-else語句選擇一些由模板宿主提供的屬性傳遞給Add View模板。

  後面一些行中有一個奇怪的語句塊:

 

  我們聲明瞭一個“List<string>”類型的變數。我們怎麼能在T4代碼中使用List類型的?因為可以看到我們在模板頂部的引用指令:

 

  第56行調用了一個方法“FilterProperties”---但是方法在哪?實際上這個方法的定義在模板底部:

 

  如果你仔細看,這個語句塊有點不一樣,是以“<#+”開始的。這是一個用來表示類的塊,它們這樣工作:T4模板帶有所有的類的特征,並且將這些特征添加到在模板的後臺編譯的類中。這不只限於方法,還包括屬性(通常包含在類中的)。像一個正規代碼文件中的類成員一樣,它們可以被模板中的其他代碼訪問。

  關於類特征塊的更多信息:http://msdn.microsoft.com/en-us/library/bb126541.aspx

  我們的預設模板使用上面截圖中的“FilterProperties”方法在預設輸出中的type包含的標記過濾獲得一些properties,這些標記必須是公共的和像GirdView一樣可以在設計器中顯示的。這與調用GridView .IsBindableType方法的結果在邏輯上是相同的。

(這段翻譯的很彆扭,所以附上原文,請大家幫忙指正)

  Our default templates use the ‘FilterProperties’ method from the above screenshot to by default output markup only for some properties in the type – namely ones that are public and would also be displayed in the designer by things like GridView.  This logic is identical to what you would get from calling the GridView.IsBindableType method.

   在136行調用的“IsBindableType”是在模板後面一點位置被定義的:

 

  如果你想改變我們模板過濾掉的某個屬性,你可以按照你的喜好修改任意一個方法。

  最後,看看第65行:

 

  這裡有一個新的標記開頭“<#=”。它被一個表達式塊調用並且用來插入T4代碼的值到輸出文本。像你在上面看到的,我們有一個foreach迴圈,迭代properties 並定義一個局部變數來迴圈調用“propertyName”。我們使用表達式塊引用該變數,因為我們想為每一個屬性名輸出一個<th>標簽。

  更多關於表達式塊:http://msdn.microsoft.com/en-us/library/bb126508.aspx

  如你所見,上面各種使用T4模板的方法通過選擇性的輸出文本使T4成為一個強大的工具,幫助我們獲得靈活的自定義的自動代碼生成。

 

MVC工具的T4宿主屬性

  Add Controller 和Add View功能都通過模板宿主提供不同的屬性給模板,上述說明貫穿了創建模板的過程。這裡完整的列出了模板宿主的有效屬性,供你的模板使用(註意:這些屬性的實際名稱可能會因為不同的版本有所不同)。

Add Controller:

Property Name

Type

Description

ItemName

System.String

帶有“Controller”尾碼的Controller類的名稱

NameSpace

System.String

生成的Controller類的命名空間

ExtraActionMethods

System.Boolean

指示用戶是否選擇在Add Controller視窗中擴展Action方法

ControllerRootName

System.String

不帶“Controller’”尾碼的Controller類的名稱

Add View:

Property Name

Type

Description

ItemName

System.String

不帶擴展名的View名稱,例如顯示於Add View視窗中的

NameSpace

System.String

預設以View所在的目錄作為命名空間

IsViewUserControl

System.Boolean

在Add View視窗中用戶是否選擇了partial view

IsViewContentPage

System.Boolean

用戶創建View時是否帶有master page

IsViewPage

System.Boolean

用戶創建的是否是符合規範的視圖頁

MasterPage

System.String

用戶在視窗中選擇的master page路徑 (只能在 IsViewContentPage是true的時候使用)

ContentPlaceholder

System.String

生成內容所在位置的占位符名稱。是用戶輸入到Add View 視窗中內容占位符ID

ContentPlaceHolders

System.Collections.Generic.List<System.String>

master page中所有內容占位符ID的列表, 如果View選擇了master page

LanguageExtension

System.String

輸出文件的擴展名 (包含”.”)

ViewDataTypeGenericString

System.String

在View指令中用來輸出泛型”Inherits”屬性的字元串(強類型 view).  例如: “<MyType>” 或 “(Of MyType)”

ViewDataType

System.Type

被綁定的強類型View的Type對象。可以獲得類型的屬性信息等

  此外,你會發現一些提供給宿主的用用的屬性,比如正在執行的模板路徑。更多關於這些屬性: http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.texttemplating.itexttemplatingenginehost_properties.aspx

摘要

  我們希望這篇文章帶給了你足夠關於T4模板的信息,能幫你有效的結合Visual Web Developer provides for ASP.NET MVC工具。你如果想知道這篇博客之外更多的信息,可以看看那的信息(Scott Hanselman’s博客不錯)並看看你能得到什麼。請回覆您的評論,建議或問題。謝謝您的閱讀!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • server { listen 443; server_name www.goforit.com goforit.com; ssl on; ssl_certificate cert/goforit.pem; ssl_certificate_key cert/goforit.key; ssl_sess... ...
  • find . -name "*.bcp" | xargs rm -rf "*.bcp" ...
  • 在本地安裝webbench,步驟如下: 安裝完畢。 一般我們只用到-c和-t兩個參數,類似下麵這樣: -t表示運行測試的時間,如果不指定預設是30秒,-c表示客戶端數量,也就是併發數。 安裝siege: wget http://soft.vpser.net/test/siege/siege-2.67 ...
  • 邏輯捲管理LVM 一 創建邏輯捲 1準備分區或硬碟 這裡使用/dev/sdb、/dev/sdc兩塊硬碟和/dev/sda9、/dev/sda10兩個分區,大小都為1G,磁碟有限,我也不想這麼摳的。 添加分區/dev/sda9、/dev/sda10 註意,要修改分區類型為Linux LVM 同樣的方法 ...
  • 本文快速分享一下快速零配置遷移 API 適配 iOS 對 IPv6 以及 HTTPS 的要求的方法,供大家參考。 <! more 零配置方案 最新的蘋果審核政策對 API 的 IPv6 以及 HTTPS 都作了要求,那麼如何快速進行適配呢? 這裡就快速給大家分享一個站點: "https://www. ...
  • 1.ngx_http_stub_status_module 是一個 Nginx 的內置 HTTP 模塊,該模塊可以提供 Nginx 的狀態信息。預設情況下這個模塊是不被編譯進來的,所以在編譯 Nginx 時要指定載入該模塊--with-http_stub_status_module 2.首先檢查ng ...
  • 本文介紹基於.net的證券公司宣傳微網站手機網頁的設計與實現方法。 隨著電腦技術的快速發展,基於Web的電腦網路金融、證券宣傳或交易網站已成為現代金融理財發展的熱點,B/S(Browser/Server)結構的互聯網宣傳也逐步在各大金融證券中得到了廣泛的應用[1]。互聯網金融(ITFIN)是指傳 ...
  • 第一種方法 string s=abcdeabcdeabcde; string[] sArray=s.Split('c') ; foreach(string i in sArray) Console.WriteLine(i.ToString()); 輸出下麵的結果: ab deab deab de 第 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...