鍍金池/ 教程/ C++/ 概述
使用主從代碼模板
CodeTemplateInfo 對象
引用其它文件或 .Net 類庫
編寫第一個代碼模板
Progress 對象
基本語法-使用注釋
基本語法-轉(zhuǎn)義Asp.Net標(biāo)記
調(diào)試
為 Yii Framework 創(chuàng)建生成 ActiveRecord 的代碼模板
基本語法-聲明和使用屬性
自動生成Yii Framework ActiveRecord類簡單模板
Merge 策略
使用 XMLProperty
CodeTemplate 對象
基本語法-CodeTemplate 指令
概述
使用 SchemaExplorer 來獲取數(shù)據(jù)庫定義

概述

前面正在介紹 hibernate 的開發(fā)教程,提到 hibernate 在 .Net 平臺上相應(yīng)的 ORM 工具為NHibernate,使用 NHibernate 就不能不提到 CodeSmith。

CodeSmith 是一種基于模板的代碼生成工具,它使用類似于 ASP.NET 的語法來生成任意類型的代碼或文本。與其他許多代碼生成工具不同,CodeSmith 不要求您訂閱特定的應(yīng)用程序設(shè)計(jì)或體系結(jié)構(gòu)。使用 CodeSmith,可以生成包括簡單的強(qiáng)類型集合和完整應(yīng)用程序在內(nèi)的任何東西。當(dāng)您生成應(yīng)用程序時(shí),您經(jīng)常需要重復(fù)完成某些特定的任務(wù),例如編寫數(shù)據(jù)訪問代碼或者生成自定義集合。CodeSmith 在這些時(shí)候特別有用,因?yàn)槟梢跃帉懩0遄詣油瓿蛇@些任務(wù),從而不僅提高您的工作效率,而且能夠自動完成那些最為乏味的任務(wù)。CodeSmith 附帶了許多模板,包括對應(yīng)于所有 .NET 集合類型的模板以及用于生成存儲過程的模板,但該工具的真正威力在于能夠創(chuàng)建自定義模板。

CodeSmith 可以從網(wǎng)站 http://www.codesmithtools.com/ 下載,個人開發(fā)版費(fèi)用在300美元左右,個人認(rèn)為還是物有所值。

還是用一個例子來說明一下使用 CodeSmith 可以大大減輕程序代碼的工作量,對于數(shù)據(jù)庫應(yīng)用來說,盡管數(shù)據(jù)庫表不盡相同,但基本過程都是定義數(shù)據(jù)庫表,設(shè)計(jì)表對應(yīng)的類,然后使用 ADO 或是 SQL 語句來訪問數(shù)據(jù)庫,創(chuàng)建對應(yīng)的類對象等。

使用 CodeSmith 提供的模板,可以幾乎不用手工編寫一行代碼,就可以自動生成上述數(shù)據(jù)庫相關(guān)的代碼。

本例使用 Visual Studio 2010 ,Codesmith 安裝時(shí)提供了 Visual Studio 插件支持。使用的示例數(shù)據(jù)庫也是 Sales,可以參見 Hibernate 開發(fā)教程(2):準(zhǔn)備開始。

由于使用 MySQL 數(shù)據(jù)庫,需要下載 MySQL .Net 庫。使用 SQL Server 可以直接使用。

  1. 創(chuàng)建一個命令行應(yīng)用 solution。

  2. 使用 CodeSmith 的 Schema Explorer 添加一個 MySQL 數(shù)據(jù)源

http://wiki.jikexueyuan.com/project/codesmith/images/1.png" alt="第1張" />

這里的 Connection String 為: SERVER=localhost;DATABASE=sales;UID=username;PASSWORD=password;(根據(jù)你自己服務(wù)器自行修改參數(shù))

添加成功后,在 Schema Explorer 中會顯示所連接的數(shù)據(jù)庫的表定義等

http://wiki.jikexueyuan.com/project/codesmith/images/2.png" alt="第2張" />

  1. 在這個 solution 中添加一個 Sales.Data Class Library.然后在項(xiàng)目中添加一個 CodeSmith 項(xiàng)目 Item

http://wiki.jikexueyuan.com/project/codesmith/images/3.png" alt="第3張" />

  1. 點(diǎn)擊 Sales.csp 使用鼠標(biāo)右鍵 Context Menu

http://wiki.jikexueyuan.com/project/codesmith/images/4.png" alt="第4張" />

使用有 Add Output 可以在項(xiàng)目中添加生成代碼的模板,這里選用 CodeSmith 自帶的 PLINQO-NH\CSharp 下的三個模板,

模板路徑為..\Users\…\Documents\CodeSmith Generator\Samples\v6.5\Templates\Frameworks\PLINQO-NH\CSharp\

分別添加三個模板,SourceDatabase 選擇 Schema Explorer 中添加的 Sales 數(shù)據(jù)庫,其它屬性使用缺省值。

http://wiki.jikexueyuan.com/project/codesmith/images/5.png" alt="第5張" />

三個模板分別為

  • Hbms 生成 hbm.xml 映射文件
  • Entities 生成和數(shù)據(jù)庫表對應(yīng)的.Net類定義
  • Queries 生成查詢數(shù)據(jù)對應(yīng)的類

然后通過 Sales.csp 的 Generate code 生成代碼。

可以看到 CodeSmith 自動生成了很多代碼,并添加了所需的引用。

http://wiki.jikexueyuan.com/project/codesmith/images/6.png" alt="第6張" />

此時(shí)用來訪問數(shù)據(jù)的類全部由 CodeSmith 生成,無需自己寫一行代碼。

  1. 看看如果使用生成的代碼來訪問數(shù)據(jù)庫,修改命令行應(yīng)用的 Program.cs 的 main 函數(shù),打印出所有 Customer 的姓名。
var salesDataContext = new SalesDataContext();
foreach (var s in salesDataContext.Customer.ToList()) 
{
    Console.WriteLine(s.FirstName+" " + s.LastName);
}

使用 SalesDataContext 中 Customer 查詢對象。然后枚舉列表中每個 Customer 對象并打印出FirstName 和 Last Name.可以看到代碼自動完成了對數(shù)據(jù)庫的讀取訪問。

http://wiki.jikexueyuan.com/project/codesmith/images/7.png" alt="第7張" />

由本例看到使用 CodeSmith 可以大大減輕手工代碼量,其使用的一般步驟是

  1. 選擇使用合適的模板,CodeSmith 隨開發(fā)包自帶了大量常用的模板,如果找不到合適的模板,CodeSmith 支持自定義模板。
  2. 為模板選擇合適的參數(shù)設(shè)置。
  3. 自動生成代碼(可以為任意類型的代碼,C#,Java, .XML 文本等)

后面將詳細(xì)介紹 CodeSmith 使用的基本方法,CodeSmith 的核心為模板,因此重點(diǎn)在模板的設(shè)計(jì)和使用。