CodeSmith 是一个代码生成工具,你可以用它生成一小段代码片断,也可以用它生成整个工程。CodeSmith采用ASP.NET的模板语法,其过程也都是先将模板转化成C#代码文件,然后编译运行C#代码文件。
在做Web项目时,如果你不用Hibernate之类的ORM工具的话,经常要写SQL语句,稍不注意就会写错,这时可以用CodeSmith来帮助生成SQL语句。
首先需要建立一个模板文件,模板文件以cst(CodeSmith Template)结尾。每个模板文件可以接受一个或多个参数,对于我这里的例子,只需要接收一个Table参数,代表为哪个表生成SQL语句。CodeSmith提供SchmeExplorer来写数据库进行集成,点击View-> Scheme Explorer可以添加数据库。模板文件开头:
<%@ CodeTemplate Language="C#" ResponseEncoding="UTF-8"%> <%@ Property Name="Table" Type="SchemaExplorer.TableSchema" Default="" Optional="False" %> <%@ Assembly Name="System.Data" %> <%@ Assembly Name="SchemaExplorer" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="SchemaExplorer" %> <%@ Import Namespace="System.Collections.Generic" %> <%@ Import Namespace="System.Text" %>
第一行声明了模板使用的语言,这里使用C#,还可以使用VB。第二行声明了模板接收的参数,参数名为Table,类型为TableSchema,这是CodeSmith内建的一个类型。接下的几行指定了依赖的Assembly,以及要导入的命名空间。
SELECT <%=SelectStat(Table.Columns)%> FROM <%=Table.Name%> <script runat="template"> public string SelectStat(ColumnSchemaCollection columns) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < columns.Count; i++) { ColumnSchema col = columns[i]; sb.Append(col.Name); if (i < columns.Count-1) sb.Append(", "); } return sb.ToString(); } </script>
CodeSmith模板的格式和ASP.NET很相近,嵌入代码是放在<%..%>之间,块代码<script>...</script>之间,只是runat不是server而是template。
创建完成之后,在Properties窗口设置Table参数的值,点击值区域会弹出对话框让你选择数据库表,你首先得在Scheme Explorer添加数据库才行。然后点击工具栏上Run按钮或者F5,就可以得到模板运行之后的结果。
你还可以添加Insert,Update,甚至存储过程,还可以根据项目习惯生成其它代码,例如如何调用SQL,如何给SQL添加参数。CodeSmith还可以做得更多,我使用CodeSmith生成对所有参考表的CRUD方法。CodeSmith自带的模板还可以生成整个项目。