CodeSmith学习(二)创建自己的第一个模板

今天根据英文帮助学习,第二篇创建自己的模板。
直接学习创建模板的语法。
1)一个做成好的模板主要包含三个部门的内容。
  ①Directives to the CodeSmith engine
      ②Static content that is copied directly to the template's output
      ③Dynamic content (programming code) that is executed by the CodeSmith engine
2)支持各种语言写法,比如C#,Vb.net ,JsScript我们目前采用C#语言来编写模板。
3)标题指令 <%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Create an AssemblyInfo.cs file." %>对每一个模板开头都必须需含有这句代码。

下面我们用一个例子来说明,一个模板中静态,动态和引擎部分应该怎么来处理。
假如我们有一段代码,如下:
using System.Reflection;
using System.Runtime.CompilerServices;
//
// Created: Friday, July 1, 2005
// Author:  Alan Maxwell
//
[assembly: AssemblyTitle("User storage utility")]
[assembly: AssemblyDescription("Helps manage data in Isolated Storage files.")]
[assembly: AssemblyConfiguration("Retail")]
[assembly: AssemblyCompany("MegaUtilities, Inc.")]
[assembly: AssemblyProduct("StorageScan")]
[assembly: AssemblyCopyright("Copyright (c) 2005 MegaUtilities, Inc.")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0")]
[assembly: AssemblyDelaySign(true)]
对于里面不同颜色我们想要不同的效果,其中红色部分我们想自动来生成,绿色部分我们想根据用户来生成,其余部分为静态,生成后的结果和模板保持一致。
首先我们创建静态部分的模板,很简单,加入认为我们模板都是静态部门,将上面代码直接拷贝到新规的模板当中,测试后,生成结果完全一致。
下来我们修改需要动态生成部分,也就是说让上面红色代码根据实际需要能够自动生成,我们用C#代码来做成自动生成的部分,目前这里的自动生成部分很简单就是一个时间,我们自然会想到 DateTime.Now,那我们如何嵌套到里面才能自动生成呢,CodeSmith为我们提供了类似Asp的语法,<% %>类似在Html中嵌套服务器代码感觉,想想我们这里道理Asp也是这种感觉。到现在我们就知道红色部分该如何修改了,把红色部分替换成<%= DateTime.Now.ToLongDateString() %><%= DateTime.Now.Year.ToString() %>
using System.Reflection;
using System.Runtime.CompilerServices;
//
// Created: <%= DateTime.Now.ToLongDateString() %>
// Author:  Alan Maxwell
//
[assembly: AssemblyTitle("User storage utility")]
[assembly: AssemblyDescription("Helps manage data in Isolated Storage files.")]
[assembly: AssemblyConfiguration("Retail")]
[assembly: AssemblyCompany("MegaUtilities, Inc.")]
[assembly: AssemblyProduct("StorageScan")]
[assembly: AssemblyCopyright("Copyright (c) <%= DateTime.Now.Year.ToString() %>MegaUtilities, Inc.")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0")]
[assembly: AssemblyDelaySign(true)]
好了动态代码写完了,现在放在CodeSmith中测试运行OK,没有问题。
下面我们看绿色部分该如何修改,绿色部分是根据客户输入来自动生成的,对于代码工具我们最好可以定义参数,类似存储过程的参数那种感觉,好先看看参数如何定义,<%@ Property Name="Author" Type="System.String" Description="Lead author of the project." %>,这是一段定义属性的代码,是不是有点类似Asp.net的头引用,
好了,上面那么多的卢瑟部分是不是要定义很多参数,当然是了,我们只能一个个定义了。根据实际需要定义好了,还需要修改,绿色部分把它换成我们定义的变量,要不然定义的变量就没有意义。好了根据理论我们修改后的代码如下:

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Create an AssemblyInfo.cs file." %>
<%@ Property Name="Author" Type="System.String" Description="Lead author of the project." %>
<%@ Property Name="Title" Type="System.String" Description="Title of the project." %>
<%@ Property Name="Description" Type="System.String" Description="Description of the project." %>
<%@ Property Name="Configuration" Type="System.String" Default="Debug" Description="Project configuration." %>
<%@ Property Name="Company" Type="System.String" Default="MegaUtilities, Inc." %>
<%@ Property Name="Product" Type="System.String" Description="Product Name." %>
<%@ Property Name="Version" Type="System.String" Default="1.0.*" Description=".NET assembly version." %>
<%@ Property Name="FileVersion" Type="System.String" Default="1.0" Description="Win32 file version." %>
using System.Reflection;
using System.Runtime.CompilerServices;
//
// Created: <%= DateTime.Now.ToLongDateString() %>
// Author:   <%= Author %>
//
[assembly: AssemblyTitle("<%= Title %>")]
[assembly: AssemblyDescription("<%= Description %>")]
[assembly: AssemblyConfiguration("<%= Configuration %>")]
[assembly: AssemblyCompany("<%= Company %>")]
[assembly: AssemblyProduct("<%= Product %>")]
[assembly: AssemblyCopyright("Copyright (c) <%= DateTime.Now.Year.ToString() %> <%= Company %>")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("<%= Version %>")]
[assembly: AssemblyFileVersion("<%= FileVersion %>")]
[assembly: AssemblyDelaySign(true)]

绿色部分太多了,就不标注了了,不过 道理都很简单,相信做过Asp,或者Jsp写这些代码应该很简单的。拷贝到模板中,输入参数,run,结果Ok, 有一点忘了说就是对于定义的属性,还可以设定默认值。好了今天学习就到这里,休息。下次学习和数据库相关的代码生成。






  
posted @ 2009-09-03 22:31  风清水远  阅读(395)  评论(0编辑  收藏  举报