Below you will find pages that utilize the taxonomy term “T4”
Posts
T4 Template - T4Enum 1.0
.NET 列舉的很多操作都會有難以避免的 Boxing/UnBoxing,像是要取得特定列舉值的列舉名,取得所有的列舉名,取得所有的列舉值,取得列舉值的 Attribute,都無法避免 Boxing/UnBoxing 的發生。
{% img /images/posts/T4Enum/1.png %}
這邊筆者嘗試用 T4 來解這問題,用 T4 範本可以遍尋專案內的所有列舉,產生對應的輔助類別與擴充方法,藉此避開列舉操作的 Boxing/UnBoxing 問題。
程式可至 NuGet Gallery | LevelUp.T4Enum 1.0.0 這邊抓取。
實際使用會像是下面這樣:
using System; using T4Enum; using T4Enum.Extensions; namespace ConsoleApplication7 { enum Permission { Function1, Function2, Function3 } class Program { static void Main(string[] args) { Console.WriteLine(Enums.Permission.Function1.Name); Console.WriteLine((int)Enums.Permission.Function1.Value); Console.WriteLine(Enums.Permission[Permission.Function2].Name); Console.WriteLine((int)Enums.Permission[Permission.Function2].Value); Console.WriteLine(Enums.Permission.GetName(Permission.Function3)); Console.WriteLine(Permission.Function3.GetName()); foreach (var item in Enums.Permission) { Console.WriteLine(item.Name); Console.WriteLine((int)item.Value); } foreach (var name in Enums.Permission.GetNames()) { Console.
read morePosts
T4 Template - JsResource.tt
在撰寫 ASP.NET 時,.NET 程式部分可用 Resource 去做多語的部分,JavaScript 這邊雖然也有 L10N 的解決方案,但是若走不同的解決方案,難以避免有些詞彙會重複定義。
這邊筆者嘗試使用 T4 來解決這樣的問題。
<#@ template language="C#" debug="false" hostspecific="true"#> <#@ assembly name="System.Windows.Forms" #> <#@ assembly name="System.Core" #> <#@ assembly name="System.Xml" #> <#@ assembly name="EnvDTE" #> <#@ assembly name="Microsoft.VisualStudio.OLE.Interop" #> <#@ assembly name="Microsoft.VisualStudio.Shell" #> <#@ assembly name="Microsoft.VisualStudio.Shell.Interop" #> <#@ assembly name="Microsoft.VisualStudio.Shell.Interop.8.0" #> <#@ import namespace="System.Resources" #> <#@ import namespace="System.Diagnostics" #> <#@ import namespace="System.Collections" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.
read morePosts
T4 template - CultureNames.tt
.NET 在操作 Culture 時,免不了要帶入 CultureInfo 的 Name,多半是用 Hard code 的形式帶入,像是下面這樣:
... var currentThread = Thread.CurrentThread; currentThread.CurrentCulture = CultureInfo.GetCultureInfo("zh-tw"); ... {% img /images/posts/T4CultureNames/1.png %}
這邊筆者做了個 T4 Template,期望能解決這樣的問題。
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.Globalization" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <#@ output extension=".cs" #> namespace System.Globalization { public static class CultureNames { <# var cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures); var length = cultures.
read morePosts
T4MVC - Add Timestamp To Static Links
T4MVC 除了解決 ASP.NET MVC Magic String 的問題外,還能解決常見的網頁 Cache 問題。
只要在 T4MVC.tt.settings.xml 設定檔中將 AddTimestampToStaticLinks 設為 True 就可以了。
... <AddTimestampToStaticLinks>True</AddTimestampToStaticLinks> ... 這樣使用 T4MVC 去取用靜態檔案的位置時,T4MVC 就會幫我們在網址後面依照檔案的修改時間去附加雜湊值,避免前端快取。
read morePosts
T4MVC - Generate a single file with everything
T4MVC 預設在產生程式碼時會依 Controller 產生不同的檔案,這樣會在專案目錄下產生很多的檔案,然而以自動產出的檔案來說,只要產生無誤,功能都正常,那麼產生的程式是不是照 Controller 分開,說實話一點都不重要。
且以現階段來說,T4MVC 無法脫離 Visual Studio 運行,因此 CI Server 無法運行 T4MVC 去產生檔案,這樣的設定使得每新增一個檔案就必需記得 Commit 對應的產出檔到版控上,反而造成不便。
好在 T4MVC 有留這部份的設定彈性,我們只要在 T4MVC.tt.settings.xml 設定檔中將 SplitIntoMultipleFiles 設為 False 即可。
... <!-- If true,the template output will be split into multiple files. --> <SplitIntoMultipleFiles>false</SplitIntoMultipleFiles> ...
read morePosts
T4MVC - A T4 template for ASP.NET MVC
玩過 ASP.Net MVC 的應該都有注意到,在寫 ASP.Net MVC 時會用到很多 Magic String。像是在取網址位置時,會需要帶入 Controller Name 以及 Action Name。
@Url.Action("Home", "Index") 在設定連結時,會需要帶入連結名稱、 Controller Name 以及 Action Name。
@Html.ActionLink("Home", "Index", "Home") 導到另外一個 Action 去處理時,又需要 Action Name。
return RedirectToAction("About"); 可以看到這些叫用帶入的都是字串,而且類似的地方還有很多,所以整個 ASP.Net MVC 寫下來會發現 Magic String 充斥在程式中。這樣的問題不僅讓我們開發上無 Intellisense 可用,編寫時不是那麼便利,修改時也容易因此而有所遺漏。
這篇要介紹的 T4MVC 就是一能解決這樣問題的 T4 範本套件。 T4MVC 透過 T4 去遍巡專案內的檔案,產生一些輔助的類別與方法的多載,巧妙的避開 Magic String 的問題。這邊可先快速的瀏覽一下 Channel 9 的相關影片,體驗一下 T4MVC 的魅力。
使用前需先透過 NuGet 搜尋並安裝 T4MVC 套件。
{% img /images/posts/T4MVC/1.png %}
{% img /images/posts/T4MVC/2.png %}
read morePosts
T4 Template - Debugging a T4 Text Template
要對 T4 Template 進行偵錯,首先需將 Template 的 Debug 設定開啟。
{% img /images/posts/DebugT4Template/1.png %}
接著在要除錯的位置上加入中斷點。
{% img /images/posts/DebugT4Template/2.png %}
然後在 T4 Template 檔案上按下滑鼠右鍵,在彈出的滑鼠右鍵快顯選單中點選 ‘Debug T4 Template’ 選單選項,即可開始進行偵錯。
{% img /images/posts/DebugT4Template/3.png %}
{% img /images/posts/DebugT4Template/4.png %}
{% img /images/posts/DebugT4Template/5.png %}
Link Debugging a T4 Text Template Tiny Happy Features #1 - T4 Template Debugging in Visual Studio 2012 - Scott Hanselman Oleg Sych - » T4 Tutorial: Debugging Code Generation Files
read morePosts
Devart T4 Editor - VS add-in for editing T4 templates
Visual Studio 內建的 T4 Template Editor 很陽春,不僅無法 Syntax Highlighting,也無法 Intellisense,在除錯時查看變數也非常不便,更無法靜態程式碼分析及 Format 程式碼,造成開發 T4 Template 的效率大幅降低。
Devart T4 Template 是ㄧ Visual Studio 的擴充套件,能解決這些煩人的問題,提升 T4 Template 的開發速度。
套件可至 Download Devart T4 Editor 這邊下載安裝。
{% img /images/posts/DevartT4Editor/1.png %}
{% img /images/posts/DevartT4Editor/2.png %}
{% img /images/posts/DevartT4Editor/3.png %}
{% img /images/posts/DevartT4Editor/4.png %}
{% img /images/posts/DevartT4Editor/5.png %}
{% img /images/posts/DevartT4Editor/6.png %}
安裝完重啟 Visual Studio,開啟 T4 Template 檔案,可以看到 Syntax Highlighting 已被支援。
{% img /images/posts/DevartT4Editor/7.png %}
Intrllisense 支援。
read morePosts
T4 template - Auto generate ConnectionString's wrapper class
在 .Net 程式中要使用資料庫的連線字串,多半我們會將資料庫的連線字串設定在 Config 檔中,然後透過 ConfigurationManager.ConnectionStrings 帶入對應的 Key 去將之取出來使用。
用這樣的撰寫方式,連線字串名稱打錯無法立即的被意識到,連線字串名稱調動時也很容易漏改,造成系統運行時的錯誤。因此有的人會將連線字串這邊再包一層,透過這層物件的屬性去取得連線字串,將連線字串的修改都在這層處理,減少人為造成的錯誤。
然而這樣的做法並無法完全解決問題,因為多包的那層還是人工下去做的,仍舊是無法避免連線名稱鍵錯的問題,連線字串變動時仍是會有改錯的可能。故這邊筆者嘗試使用 T4 template,讀取專案的 config 檔,動態產生強型別物件,提供連線字串給系統使用。
首先我們要為專案加入一個 t4 template 檔。
然後將其程式碼替換成下面這樣。
<#@ template debug ="true" hostspecific="True" language= "C#" #> <#@ assembly name ="EnvDTE" #> <#@ assembly name ="System.Core.dll" #> <#@ assembly name ="System.Configuration" #> <#@ assembly name ="System.Xml" #> <#@ import namespace ="System.Collections.Generic" #> <#@ import namespace ="System.Configuration" #> <#@ import namespace ="EnvDTE" #> <#@ import namespace ="System.Xml" #> <#@ output extension =".
read more