什么是CodeSmith?从字面上直译可以看作“代码工匠”。这倒是个很拟人化的名称,顾名思义,CodeSmith的目标就是根据模板生成规范可用的代码,为程序员减轻工作负担。
程序员是软件开发团队中的最小单位,有什么任务都只能自己一肩扛起而无法再往下分配。但是程序员又是聪明的,他们总是能找到很多美妙的办法来减轻压力,代码生成器就是一个典型的例子。事实上,Visual Studio 2005本身就自带了代码生成的功能,比如您在代码编辑器中输入关键字“for”,然后直接按Tab键,代码生成器便会为您生成好一段模板式的代码:
static void Main(string[] args)
{
for (int i=0;i<length;i++)
{
}
}
Visual Studio 2005还能自动生成其它更多形式的代码,但终究不如CodeSmith那样强大和丰富,毕竟术业有专攻嘛。CodeSmith是以模板作基础来为程序员生成高质量代码的,模板可大可小,CodeSmith一次能够生成的代码量也就可多可少,这主要靠具体问题具体分析。
CodeSmith的模板是以“.cst”为后缀名的代码文件,其风格非常类似于ASP.NET。模板中除了大量固定的代码以外,还有遍布于各处的元数据(metadata)。固定代码就是会被CodeSmith原封不动地输出的代码,而元数据则可以被看作是模板中的变量。
CodeSmith是一个基于模板的代码生成器。模板是所生成代码的式样。开发者或架构师可应用CodeSmith来生成任何文本语言的代码。其结果(生成的代码)可通过属性来自定义并包含在众多的标准属性类型之中。另外,用户还可建立自定义的属性类型。
针对.NET Framework而言,性质可以是任何拥有设计器的.NET对象。例如,它可以是一个简单的分配标题的字符串性质。另一方面,可用TableSchema对象来访问数据库表中的一切内容。
CodeSmith工具的一个强项是它的语法,其与ASP.NET的方法相当。实际上,你使用CodeSmith生成代码之前必须编写相应的模板,可以使用C#、VB.NET和JScript.NET进行模板的编写。事实上,CodeSmith可输入任何ASCII语言。
CodeSmith 包括两个工具,一个是CodeSmithStudio.exe是用来设计和编译模板;另一个是CodeSmith.exe是用来运行模板生成代码的, CodeSmith.exe还可以与VS.NET集成,成为VS.NET的一个外部工具。
以下是对CodeSmith实现原理的简略概述:
1、支持执行代码块语法 ,与 Asp.net语法一模一样
2、支持内联表达式语法 ,与 Asp.net语法一模一样
3、 支持Code Behind功能(,与 Asp.net的()类似
4、 支持 函数代码块功能, 与Asp.net的函数代码块功能 类似
5、支持属性申明,用于配置模板的属性. Asp.net语法不支持.
那么现在我们就通过一个简单的模板文件来了解CodeSmith的工作原理:
如果您了解ASP.NET的语法,那么就很好理解CodeSmith模板文件了
<%@ CodeTemplate ResponseEncoding="UTF-8" Debug="True" Src="Base.cst.cs" Inherits="BasePage" Language="C#" TargetLanguage="C#" Description="Demonstrates the most basic template." %>
<%@ Property Name="Tables" Type="SchemaExplorer.TableSchemaCollection" Category="Source" Optional="True" %>
<%@ Property Name="Views" Type="SchemaExplorer.ViewSchemaCollection" Category="Source" Optional="True" %>
<%@ Property Name="MustLog" Type="System.Boolean" Default="true" Category="Source" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="CodeSmith.CustomProperties" %>
<%@ Assembly Name="System.Data" %>
<%@ Assembly Name="System.Design" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Design" %>
● Description:作为模板的描述性信息并可以在该模板的ToolTip中显示;
● Inherits:尽管默认情况下所有模板都继承自CodeSmith.Engine.CodeTemplate,但仍然可以由您来指定模板继承自其它类(只要该类直接或间接地继承自CodeSmith.Engine.CodeTemplate);
● Src:该属性使您能够将其它类的功能添加进当前模板,您能够用这个属性来实现“代码隐藏”模型;
● Debug:当该属性被设置为True时,您就可以使用System.Diagnostics.Debugger.Break方法来为您的模板设置断点;
●OutputType:该属性用于指定以“Normal”、“Trace”或“None”方式输出模板;
● LinePragmas:当该属性被设置为True时,模板错误将指向源代码;设置为False时,模板错误将指向编译后的代码;
●ResponseEncoding:用于设置模板及输出的编码,该属性支持来自于System.Text.Encoding.GetEncoding方法的值,默认情况下为ASCII。
● Language :模板语言
● TargetLanguage :创建代码语言(生成的代码的语言类型)
把生成的partial文件夹直接复制到逻辑层(BLL)中, BLL添加DAL引用(用Subsonic生成DAL文件),这样就可以使用生成代码了。(逻辑层引用数据库层)
注意: