编写你的第一个模版
CodeSmith和其他的代码生成工具相比较,最有价值的是:
你可以通过编写你需要生成的代码的代码生成模版,你可以
规定它代码如何生成,甚至指定在代码里面tabs和空格的
数量。你可以完全控制你的代码输出,其他的工具几乎不可能完成
这样的功能。
你用来生成模版的工具已经有一堆不同的功能,如果你正在使用个人版的
CodeSmith,你可以使用CodeSmith Studio,它有丰富的CodeSmith
模版环境。如果你没有使用个人版或者试用过期,那么你可以使用任何的文本编辑
器创建你的模版。
下面我们将创建一个简单的模版,它接受一些字符串然后创建一个包含了特殊注释头的
类。这是一个简单的例子,但它将展示CodeSmith模版创建的基础。我发现设计一个模
版最好的方式是首先创建一个模版的需要输出结果的代码,下面个就是模版将输出的内
容:
程序代码
程序代码
///////////////////////////////////////////////////////////////////////////////////////
// File: MyClass.cs
// Description: Enter summary here after generation.
// ---------------------
// Copyright ? 2003 Our Client
// ---------------------
// History
//    11/30/2003    Developer's Name    original Version
///////////////////////////////////////////////////////////////////////////////////////
using System;
namespace MyNamespace
{
      /// <summary>
      /// Summary description for MyClass.
      /// </summary>
      public class MyClass
      {
            public MyClass()
            {
                  //
                  // TODO: Add constructor logic here
                  //
            }
      }
}

这就是我们想模版最终生成的结果,不过我们需要在模版每次运行时指定一些东西。
那么现在让我们来开始编写模版吧。
首先打开一个空白的文本文件,并在文件头部增加一个CodeTemplate的标签。
CodeTemplate 标签告诉CodeSmith这是一个模版文件,和模版用什么语言编写的,
模版生成的语言以及模版描述。下面是一个CodeTemplate标签:
程序代码
<%@ CodeTemplate Language="C#" TargetLanguage="C#"
      Description="Generates a class including a special informational header" %>
首先我们设置模版语言为C#,接着设置模版生成的语言为C#,然后添加模版描述。
还有一些其它的属性可以在标签中增加,它将在文档其他的地方被代替。
接着声明模版在运行时候需要的变量。本例模版中想指定命名空间的名称,类名和
开发者的名称。下面是三个需要声明的属性:
程序代码
程序代码
<%@ Property Name="NameSpace" Type="String"
      Category="Context"
      Description="The namespace to use for this class" %>
<%@ Property Name="ClassName" Type="String"
      Category="Context"
      Description="The name of the class to generate" %>
<%@ Property Name="DevelopersName" Type="String"
      Category="Context"
      Description="The name to include in the comment header" %>

每个属性标签包括Name属性,它被用来做模版其它地方的属性的值和属性类型的参考。
我们已经为每个属性设置了一个类别和描述,这些在模版被CodeSmith打开的时候可以
用来定义相关的属性。
接着修改模版文本以便当属性被指定时候文本文字可以被插入到正确位置。
你可以使用Asp.Net类似的语法和属性名称来操作,比如:
///////////////////////////////////////////////////////////////////////////////////////
// File: <%=ClassName%>.cs
值将被文本替代,正如你说见语法和Asp.net类似。我们想看到我们所希望的剩余部分
和用属性名称替换硬编码的。这个实例模版全部内容:
程序代码
程序代码
<%@ CodeTemplate Language="C#" TargetLanguage="C#"
      Description="Generates a class including a special informational header" %>
<%@ Property Name="NameSpace" Type="String"
      Category="Context"
      Description="The namespace to use for this class" %>
<%@ Property Name="ClassName" Type="String"
      Category="Context"
      Description="The name of the class to generate" %>
<%@ Property Name="DevelopersName" Type="String"
      Category="Context"
      Description="The name to include in the comment header" %>
     
///////////////////////////////////////////////////////////////////////////////////////
// File: <%=ClassName%>.cs
// Description: Enter summary here after generation.
// ---------------------
// Copyright ? <%= DateTime.Now.Year %> Our Client
// ---------------------
// History
//    <%= DateTime.Now.ToShortDateString() %>    <%= DevelopersName%>    original Version
///////////////////////////////////////////////////////////////////////////////////////
using System;
namespace <%=NameSpace %>
{
      /// <summary>
      /// Summary description for <%=ClassName %>.
      /// </summary>
      public class <%=ClassName %>
      {
            public <%=ClassName %>()
            {
                  //
                  // TODO: Add constructor logic here
                  //
            }
      }
}
正如你所看到的我们在几个不同的地方应用了我们定义的那些属性,我们也使用了
DateTime对象去为我们显示一个时间。现在我们需要在CodeSmith explorer中调用
这个模板,运行你的CodeSmith explorer,单击文件夹图标选择模板文件所在的目录
。你会看到目录下的所有模板列表,接着双击模板载入他。模板载入之后我们可以
在面板上看到他的属性列表,如图:
可以看到我们声明的三个属性,包括类别说明和描述。当你单击生成按钮后,CodeSmith使用指
定的属性和我们的模板代码生成下列的内容。
程序代码
程序代码
///////////////////////////////////////////////////////////////////////////////////////
// File: MyClass.cs
// Description: Enter summary here after generation.
// ---------------------
// Copyright ? 2003 Our Client
// ---------------------
// History
//    12/2/2003    Mr. Smith    original Version
///////////////////////////////////////////////////////////////////////////////////////
using System;
namespace MyNameSpace
{
      /// <summary>
      /// Summary description for MyClass.
      /// </summary>
      public class MyClass
      {
            public MyClass()
            {
                  //
                  // TODO: Add constructor logic here
                  //
            }
      }
}

你可以把生成的代码拷粘贴到Visual Studio或其他你使用的编译器中,然后
编译他们。
这是一个CodeSmith可以做什么的最简单的例子,但列举了一些要点:
。模板应该包括一个CodeTemplate声明;
。模板可以有很多个属性和用属性声明的被声明的属性。
。使用asp.net语法把属性值插入到输出的模板中
。模板是100%定制的,你可以用CodeSmith生成任何种类的文本。
可是上面的例子还不能真正的展示CodeSmith的强大能力,下节中
我们会看到怎么样基于数据库对象动态的生成代码。5Þ)P?œB bbs.51aspx.comÔBµU êÐ
posted on 2008-10-14 13:58  Madream.F  阅读(282)  评论(0编辑  收藏  举报