CodeSmith
CodeSmith 是一種基於模板的代碼產生工具,它使用類似於 ASP.NET 的文法來產生任意類型的代碼或文本。與其他許多代碼產生工具不同,CodeSmith 不要求您訂閱特定的應用程式設計或體繫結構。使用 CodeSmith,可以產生包括簡單的強型別集合和完整應用程式在內的任何東西。
當您產生應用程式時,您經常需要重複完成某些特定 的任務,例如編寫資料存取碼或者產生自訂集合。CodeSmith 在這些時候特別有用,因為您可以編寫模板自動完成這些任務,從而不僅提高您的工作效率,而且能夠自動完成那些最為乏味的任務。CodeSmith 附帶了許多模板,包括對應於所有 .NET 集合類型的模板以及用於產生預存程序的模板,但該工具的真正威力在於能夠建立自訂模板。為了使您能夠入門,我將快速介紹一下如何產生自訂模板。
產生自訂模板
CodeSmith 模板只是一些可以在任意文字編輯器中建立的文字檔。它們的唯一要求是用 .cst 副檔名來儲存它們。我將要產生的樣本模板將接受一個字串,然後基於該字串產生一個類。建立模板的第一步是添加模板頭,它可聲明模板的語言、目標語 言以及簡要模板說明:
模板的下一部分是屬性聲明,在這裡可聲明將在模板每次運行時指定的屬性。就該模板而言,我要使用的唯一屬性只是一個字串,因此屬性聲明如下所示:
該屬性聲明將使 ClassName 屬性出現在 CodeSmith 屬性視窗中,以便可以在模板運行時指定它。下一步是實際產生模板主體,它非常類似於用 ASP.NET 進行編碼。您可以在下面的代碼塊中查看該模板的主體。
//Custom Template
public sealed class <%=?ClassName?%>
{
private static volatile <%=?ClassName?%> _instance;
private <%=?ClassName?%>() {}
private static readonly object _syncRoot = new object();
public static <%=?ClassName?%> Value
{
get
{
if (_instance == null)
{
lock(_syncRoot)
{
if (_instance == null)
{
_instance = new <%=?ClassName?%>();
}
}
}
return _instance;
}
}
}
//SingletonClass
public sealed class SingletonClass
{
private static volatile SingletonClass _instance;
private SingletonClass() {}
private static readonly object _syncRoot = new object();
public static SingletonClass Value
{
get
{
if (_instance == null)
{
lock(_syncRoot)
{
if (_instance == null)
{
_instance = new SingletonClass();
}
}
}
return _instance;
}
}
}
正 如您所見,該模板接受字串輸入並使用該類名產生單獨的類。在模板主體中,使用與 ASP.NET 中相同的起始和結束標記。在該模板中,我只是插入屬性值,但您還可以在這些標記內部使用任意類型的 .NET 代碼。在該模板完成之後,您就可以通過雙擊它或者從 CodeSmith 應用程式中開啟它將其載入到 CodeSmith 中。顯示了已經載入到 CodeSmith 中的該模板。
您可以看到左側的屬性正是我在該模板中聲明的屬性。如果我輸入“SingletonClass”作為類名,並單擊 Generate 按鈕,則將產生上面的代碼塊底部顯示的類。
CodeSmith 使用起來相當容易,如果能夠正確應用,則可以產生一些令人難以置信的結果。面向代碼產生的應用程式中最常見的部分之一是資料訪問層。CodeSmith 包括一個名為 SchemaExplorer 的特殊的程式集,可用來從表、預存程序或幾乎任何其他 SQL Server? 對象產生模板。
CodeSmith 由 Eric J. Smith 編寫,並且可以在 http://www.ericjsmith.net/codesmith 下載。