課程代碼課件48-orm ef框架進(jìn)階專題1t4模板_第1頁
課程代碼課件48-orm ef框架進(jìn)階專題1t4模板_第2頁
課程代碼課件48-orm ef框架進(jìn)階專題1t4模板_第3頁
課程代碼課件48-orm ef框架進(jìn)階專題1t4模板_第4頁
課程代碼課件48-orm ef框架進(jìn)階專題1t4模板_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

((一)什么是T4T4,即4個(gè)T開頭的英文字母組合:TextTemteTransformationToolkit4文本模板即一種自定義規(guī)則的代碼根據(jù)業(yè)務(wù)模型可生成的文本文件或供程序調(diào)用的字符串(模型以適合于應(yīng)用程序域的形式包含信息,并且可以在應(yīng)用程序的生存期更改)VS本身只提供一套基于T4引擎的代碼生成的執(zhí)行環(huán)境,由下面程序集構(gòu)成.VisualStudio.TextTem.VisualStudio.TextTem.VisualStudio.TextTem.VisualStudio.TextTem便利工1T4Toolbox.msi(CodePlex上開源的工具提供一些可以直接使用的代碼,比如EnumSQLView、AzManwrapper、LINQtoSQLclasses、LINQtoSQLschemaEntityFrameworkDAL等。提供一些基于T4方面的VS的擴(kuò)展:當(dāng)你安裝之后,在“AddNewItem”框中就會多出一個(gè)命名為“Code2、T4模板編輯器(eg:支持代碼、智能提示tangbleT4Editor(VisualT4(當(dāng)然我們也可以通過VS2010中新增的擴(kuò)展管理(ExtensionManager)來添加Vs擴(kuò)展擴(kuò)展(ExtensionManager),這和Eclipse/Netbeans有些相似,用戶可以直接在IDE中從VisualStudio庫(VisualStudioGallery)找到并擴(kuò)展。通過VS的菜單Tools->ExtensionManager,這里你可以添加,刪除已經(jīng)安裝的VS的擴(kuò)展插件。打開筆者在T4的時(shí)候使用過上面兩個(gè)T4模板編輯器。稍作幾點(diǎn)對比tangibleT4Editor可選擇安裝內(nèi)UML模板對于不是常dlleg:EnvDTE.dll,tangibleT4Editor免費(fèi)版和VisualT4都不支持導(dǎo)航,并且所報(bào)的提示tangibleT4Editor免費(fèi)版中提示如VisualT4中則直接提但是在VisualT4中我們可以通過在程序集中引入EnvDTE.dll解決此錯誤的提(完成開發(fā)后可移除程序集),同時(shí)我們也可以看到VisualT4中代碼也更加貼近VS(藍(lán)色字體標(biāo)注對象)。就“代碼”和“智能提示”方面VisualT4工具表現(xiàn)更完美(前提是必須主動在項(xiàng)目中引入對應(yīng)程序集),但目前版本存在縮進(jìn)問題實(shí)在可惜,悲憤中等更新。.可能你還想要tangibleT4Editor提供的UML模板模型,呵呵……現(xiàn)在我本機(jī)同時(shí)裝了這兩款T4編輯器,暫 ((二)T4基本結(jié)T4模板可以分為:指令塊、文本塊、控制塊指令塊-向文本模板化引擎提供關(guān)于如何生成轉(zhuǎn)換代碼和輸出文件的一般指令文本塊-直接到輸出的內(nèi)容控制塊-向文本插入可變值并控制文本的條件或重復(fù)部件的程序代碼,不能在控制塊中嵌套控制塊n指令6個(gè)指令<#@temte#>、<#@parameter#>、<#@assembly#>、<#@import#>、<#@include#>、<#@output其中outputassembly只能用在設(shè)計(jì)時(shí)模板T4模板指 [inherits="temteBaseClass"][compilerOptions="options"]#>這里只說明下inherits屬性,其余屬性在本文更合適的地方有進(jìn)行說明指定模板的程序代碼繼承自另一個(gè)類,該基類可以是由其他模運(yùn)行時(shí)(預(yù)處理過的)文本模板中的繼如果不inherits特性,則會從您的文本模板生成基類和派生類。指定inherits特性時(shí),僅生成派生類設(shè)計(jì)時(shí)文本模板中的繼設(shè)計(jì)時(shí)模板會生成任何類型的“文本文件”,此文件將組成VisualStudio項(xiàng)目的一部分。T4模板引擎首先要將模板轉(zhuǎn)換為中間程序代碼文件,中間代碼文件將寫入您%TEMP環(huán)境變量)。默認(rèn)該生成的中間代碼繼承自.VisualStudio.TextTemting.TextTransformation類,但你也可根據(jù)需求使用inherits特性指定派生于TextTransformation類的任何基類。模板引擎生成轉(zhuǎn)換類更詳細(xì)的請參考本文后面的何時(shí)編譯,編譯過程節(jié)T4參數(shù)指<#@parametertype="Full.TypeName"name="ParameterName"在VsalStdo文本模板中,pramtr指令模板代碼中從自外部上下文傳入的值初始化的屬性??梢匀魏晤愋偷膮?shù)。也就是說類型必須使用SrilzbeArbte進(jìn)行或者必須從MrshByRObct派生。這樣可以將參數(shù)值傳遞到在其中處理模板的App中。如何使用及內(nèi)部運(yùn)作機(jī)制請查看我的另一篇文章(譯)理解T4模板:<#@parameter#>T4導(dǎo)入指<#@importnamespace="namespace"T4包含指<#@includefile="filePath"以被<#@include#>到一個(gè)或多個(gè)模板文件中。對于包含文件,文件擴(kuò)展名使用.ttinclude可讀性更好。(以區(qū)分后綴為.tt的運(yùn)行時(shí)或設(shè)計(jì)時(shí)文本模板T4輸出指<#@outputextension=".fileNameExtension"[encoding="encoding"]運(yùn)行時(shí)(預(yù)處理)文本模板中不需要output指令。應(yīng)用程序通過調(diào)用TextTransform()來獲取已生成的字符T4程序集<#@assemblyname="[assemblystrongname|assemblyfilename]"在預(yù)處理文本模板中,assembly指令無效。改為在VisualStudio項(xiàng)目中直接“添加”。GAC中程序集的例如System.Xml.dll還可以使用長名稱例如name="System.XmlVersion=,程序集的絕對路來環(huán)境變量另,給出一些常用的【生成命令和屬性的宏當(dāng)前項(xiàng)目配置的名稱(如“Debug”)$(當(dāng)前項(xiàng)目平臺的名稱(如“Win32”)項(xiàng)目的基本名生成的主輸出文件 (定義為驅(qū)動器+路徑);包括尾部的反斜杠“\”生成的主輸出文件的基本名安裝.NETFramework VisualStudio使用的.NETFramework版本從Web部署根到項(xiàng)目輸出所屬于的位置的相對路徑。返回與RelativePath相同的值指向<localhost>位置的絕對路徑。例如,c:\inetpub\wwwrootn控制有三種類型的控制塊,根據(jù)其左括號對它們進(jìn)行區(qū)分<#標(biāo)準(zhǔn)控制塊 可以包含語句<=表達(dá)式控制塊#> 將一個(gè)可以計(jì)算為字符串的表達(dá)式括起來,用于提供要寫入“輸出”文件的字符串的代碼。<+類功能控制塊#> 可以使用類功能控制塊向文本模板添加方法屬性字段甚至是嵌套類必須作為文件中的最后一個(gè)塊顯示,或者用<@iclde#>引入外部文件。注意始終使用{...}花括號來包含內(nèi)嵌的嵌套語句,否則會報(bào)錯。(哪怕花括號中只有一句代碼控制塊不能互相嵌套。必須先終止之前的控制塊,然后才能打開另一((三)設(shè)計(jì)時(shí)模板和運(yùn)行時(shí)模T4文本模板分為:設(shè)計(jì)時(shí)模板和運(yùn)行時(shí)模n添加設(shè)計(jì)時(shí)模板(文本模板優(yōu)勢:當(dāng)需求變化時(shí),可以根據(jù)業(yè)務(wù)需求調(diào)整模型(輸入),按照指定規(guī)則將“模型”生成任何類型的“文本文件”,例如:網(wǎng)頁、資源文件或任何語言的程序源代碼。(模型:是描述應(yīng)用程序特定方面的數(shù)據(jù)源。它可以是、任何類型的文件或數(shù)據(jù)庫。如:數(shù)據(jù)庫、配置文件、UML模型、DSL模型或其他源)VS中新建文件——常規(guī)——文本模板。(如圖該模板文件中已包含下列指<#@temtedebug="false"hostspecific="false"language="C#"<#@outputextension=".txt"或則,添加“純文本文件”并設(shè)置下圖屬性,加入相關(guān)指令。(后綴推薦改為標(biāo)準(zhǔn)的設(shè)計(jì)時(shí)模板:TextTem運(yùn)行時(shí)模板(已預(yù)處理的文本模板優(yōu)勢:當(dāng)需求變化時(shí),可以根據(jù)業(yè)務(wù)需求調(diào)整模型(輸入),在運(yùn)行時(shí)按照指定規(guī)則將“模型”生成為“文本字符串”VS中新建文件——常規(guī)——已預(yù)處理的文本模板該模板文件包含指令:<#@temtelanguage="C#"或則,添加“純文本文件”并設(shè)置相應(yīng)屬性,加入相關(guān)指令運(yùn)行時(shí)模板:TextTemn何時(shí)編譯,編譯過何時(shí)編在下列任何一種情況下,將執(zhí)行模板,同時(shí)生成附屬文件,生成的文件將作為項(xiàng)目的一部分編譯(屬性 生成操作編譯編輯模板(模板有異動且沒有被保存),當(dāng)前編輯模板失去焦點(diǎn)保存模板在“解決方案資源管理器”中單擊“轉(zhuǎn)換所有模板”。轉(zhuǎn)換解決方案中的所有模板右擊“解決方案資源管理器”中的一個(gè)或多個(gè)模板文件,然后選擇“運(yùn)行自定義工具”文本模板轉(zhuǎn)換引擎將“文本模板”轉(zhuǎn)換為可執(zhí)行的cs代碼——“轉(zhuǎn)換類”。轉(zhuǎn)換類(*.cs)存于臨時(shí) 錄在“環(huán)境變量”中設(shè)置:右鍵“我的電腦”—“屬性”—“高級系統(tǒng)設(shè)置”—“高級”選項(xiàng)卡中“環(huán)境變量”—TEMP變量)命名空間:.VisualStudio.TextTemting+隨機(jī)基類:.VisualStudio.TextTem類名引擎編譯生成的“轉(zhuǎn)換類”生成dll,dll存于臨 下。具體是哪個(gè)dll可以在模板的“調(diào)試環(huán)境”下使System.Reflection.Assembly.GetExecutingAssembly();執(zhí)行已編譯的轉(zhuǎn)換類,生成“文件”。新文件會在“解決方案資源管理器”中出現(xiàn)在文本模板文件下運(yùn)行時(shí)運(yùn)行時(shí)模板沒有<#@output#>指令,文本模板引擎將“運(yùn)行時(shí)模板”直接編cs文件,作為項(xiàng)目的一部分編命名空間:默認(rèn)為所屬程序集名空基類:模板文類名:模板文件名(PreTextTemteTest.tt)——注意是“分部類生成的代碼文件隨著項(xiàng)目一起編譯,并可在應(yīng)用程序中通過調(diào)用生成類中的rasrTx()方法輸出“文本字符串”。另外,若要在特定命名空間中放置模板轉(zhuǎn)換生成的類,需設(shè)置模板文件的“自定義工具命名空間”注意事控制塊使用rasrTx()方法是由模板引擎將模板中的所有“控制塊”代碼(包括“包含的模板”組合生成。所以在使用控制塊時(shí)應(yīng)注意以下幾點(diǎn):語言:只能使用一種語言局部變量:確保局部變量的名稱不會文本模板在單獨(dú)的App中運(yùn)請注意,文本模板在與主應(yīng)用程序分開的App 中運(yùn)行。在大多數(shù)情況下這并不重要,但在某些復(fù)雜的情況下您可能會發(fā)現(xiàn)一些限制例如如果要從單獨(dú)的服務(wù)將數(shù)據(jù)傳入模板或從中傳出數(shù)據(jù)則該服務(wù)必須提供可序列化的I。((四)技l快速編寫模以生成文件為原型,然后逐步插入用于改變結(jié)果的控制lT4文本模板的斷點(diǎn)表:設(shè)置DbgJITDebugLaunchSetting值為2(x86系統(tǒng)):HKEY_LOCAL_MACHINE\SOFTWARE\(x64系統(tǒng)):HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\為temte指令添加debug="true"特性:<#@temte 在模板執(zhí)行到特定點(diǎn)啟動調(diào)試器。如果用啟動調(diào)試器在調(diào)試完后會導(dǎo)致VS奔潰SyseDanscsDbgrBrek();> 啟動調(diào)試器后,使用此命令在后續(xù)特定點(diǎn)處再次進(jìn)入調(diào)試模式,相當(dāng)于斷點(diǎn)。使用方法:必須使用“Deugr.ac()”(如下圖,啟動新實(shí)例或使用已存在的VS處點(diǎn)擊取消則將關(guān)閉當(dāng)前DE),調(diào)試完后可以不用中斷調(diào)試,不影響模板編輯,當(dāng)再次編譯模板時(shí)如果存在“DbgrBrk()”命令則自動進(jìn)入調(diào)試模式。l向模板傳遞參數(shù)的兩種方parameter#>指令》。rsfrTx()實(shí)例方法前進(jìn)行初始化。l使用模板繼承共享可以通過編寫基類模板(可以是抽象模板)在文本模板之間共享內(nèi)容。使用<@#temte#>指令的inherits特性指定l運(yùn)行時(shí)調(diào)用設(shè)計(jì)時(shí)模板返回字符調(diào)用.VisualStudio.TextTemting.Engine的ProcessTemte方法publicstringProcessTemstringITextTemtingEngineHost) 參數(shù)指定文本模板的內(nèi)容,eg:使用System.IO.File.ReadAllText(Path) 參數(shù)指定的宿主,必須是實(shí)現(xiàn)ITextTemtingEngineHost的類。這是由模板引擎回調(diào)的。宿主必須能記錄錯誤、解析對程序集和包含文件的、提供可在其中執(zhí)行模板的應(yīng)用程序域并為每條指令調(diào)用相應(yīng)的處理器。演練:創(chuàng)建自定義文本模板((五)常用方n模板基類提供的方設(shè)計(jì)時(shí)模板繼承TextTransformation抽象運(yùn)行時(shí)模板默認(rèn)繼承自動生成的基Write()和Wriine()方寫入目的輸出文本的三種方文本表達(dá)式控制塊 <#=變量標(biāo)準(zhǔn)<#Write()|Wriine()#>,因?yàn)榭刂茐K不能嵌套,所以此種方式比<#=變量#>書寫更雅輸出文本縮進(jìn)設(shè)可以使用縮進(jìn)方法設(shè)置文本模板輸出的格PushIndent(string 添加指定格式,內(nèi)部會將字符長度加入到緩存變量indentLengths列表(L

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論