[网摘].NET 程序员十种必备工具-CodeSmith

CodeSmith

CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同,CodeSmith 不要求您订阅特定的应用程序设计或体系结构。使用 CodeSmith,可以生成包括简单的强类型集合和完整应用程序在内的任何东西。

当您生成应用程序时,您经常需要重复完成某些特定 的任务,例如编写数据访问代码或者生成自定义集合。CodeSmith 在这些时候特别有用,因为您可以编写模板自动完成这些任务,从而不仅提高您的工作效率,而且能够自动完成那些最为乏味的任务。CodeSmith 附带了许多模板,包括对应于所有 .NET 集合类型的模板以及用于生成存储过程的模板,但该工具的真正威力在于能够创建自定义模板。为了使您能够入门,我将快速介绍一下如何生成自定义模板。

生成自定义模板

CodeSmith 模板只是一些可以在任意文本编辑器中创建的文本文件。它们的唯一要求是用 .cst 文件扩展名来保存它们。我将要生成的示例模板将接受一个字符串,然后基于该字符串生成一个类。创建模板的第一步是添加模板头,它可声明模板的语言、目标语 言以及简要模板说明:

模板的下一部分是属性声明,在这里可声明将在模板每次运行时指定的属性。就该模板而言,我要使用的唯一属性只是一个字符串,因此属性声明如下所示:

该属性声明将使 ClassName 属性出现在 CodeSmith 属性窗口中,以便可以在模板运行时指定它。下一步是实际生成模板主体,它非常类似于用 ASP.NET 进行编码。您可以在下面的代码块中查看该模板的主体。

[网摘].NET 程序员十种必备工具-CodeSmith // Custom Template
[网摘].NET 程序员十种必备工具-CodeSmith
public sealed class <%= ?ClassName? %>
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith      
private static volatile <%= ?ClassName? %> _instance;
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith      
private <%= ?ClassName? %> () [网摘].NET 程序员十种必备工具-CodeSmith {}
[网摘].NET 程序员十种必备工具-CodeSmith      
private static readonly object _syncRoot = new object ();
[网摘].NET 程序员十种必备工具-CodeSmith
[网摘].NET 程序员十种必备工具-CodeSmith      
public static <%= ?ClassName? %> Value
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith      
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith            
get
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith            
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith                  
if (_instance == null )
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith                  
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith                        
lock (_syncRoot)
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith                        
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith                              
if (_instance == null )
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith                              
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith                                     _instance
= new <%= ?ClassName? %> ();
[网摘].NET 程序员十种必备工具-CodeSmith                               }

[网摘].NET 程序员十种必备工具-CodeSmith                         }

[网摘].NET 程序员十种必备工具-CodeSmith                   }

[网摘].NET 程序员十种必备工具-CodeSmith                  
return _instance;
[网摘].NET 程序员十种必备工具-CodeSmith             }

[网摘].NET 程序员十种必备工具-CodeSmith       }
      
[网摘].NET 程序员十种必备工具-CodeSmith}

[网摘].NET 程序员十种必备工具-CodeSmith
[网摘].NET 程序员十种必备工具-CodeSmith
// SingletonClass
[网摘].NET 程序员十种必备工具-CodeSmith
public sealed class SingletonClass
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith      
private static volatile SingletonClass _instance;
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith      
private SingletonClass() [网摘].NET 程序员十种必备工具-CodeSmith {}
[网摘].NET 程序员十种必备工具-CodeSmith      
private static readonly object _syncRoot = new object ();
[网摘].NET 程序员十种必备工具-CodeSmith
[网摘].NET 程序员十种必备工具-CodeSmith      
public static SingletonClass Value
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith      
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith            
get
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith            
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith                  
if (_instance == null )
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith                  
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith                        
lock (_syncRoot)
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith                        
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith                              
if (_instance == null )
[网摘].NET 程序员十种必备工具-CodeSmith[网摘].NET 程序员十种必备工具-CodeSmith                              
[网摘].NET 程序员十种必备工具-CodeSmith {
[网摘].NET 程序员十种必备工具-CodeSmith                                     _instance
= new SingletonClass();
[网摘].NET 程序员十种必备工具-CodeSmith                               }

[网摘].NET 程序员十种必备工具-CodeSmith                         }

[网摘].NET 程序员十种必备工具-CodeSmith                   }

[网摘].NET 程序员十种必备工具-CodeSmith                  
return _instance;
[网摘].NET 程序员十种必备工具-CodeSmith             }

[网摘].NET 程序员十种必备工具-CodeSmith       }
      
[网摘].NET 程序员十种必备工具-CodeSmith}

[网摘].NET 程序员十种必备工具-CodeSmith
[网摘].NET 程序员十种必备工具-CodeSmith


正 如您所见,该模板接受字符串输入并使用该类名生成单独的类。在模板主体中,使用与 ASP.NET 中相同的起始和结束标记。在该模板中,我只是插入属性值,但您还可以在这些标记内部使用任意类型的 .NET 代码。在该模板完成之后,您就可以通过双击它或者从 CodeSmith 应用程序中打开它将其加载到 CodeSmith 中。下图显示了已经加载到 CodeSmith 中的该模板。

[网摘].NET 程序员十种必备工具-CodeSmith

您可以看到左侧的属性正是我在该模板中声明的属性。如果我输入“SingletonClass”作为类名,并单击 Generate 按钮,则将生成上面的代码块底部显示的类。

CodeSmith 使用起来相当容易,如果能够正确应用,则可以产生一些令人难以置信的结果。面向代码生成的应用程序中最常见的部分之一是数据访问层。CodeSmith 包括一个名为 SchemaExplorer 的特殊的程序集,可用来从表、存储过程或几乎任何其他 SQL Server? 对象生成模板。

CodeSmith 由 Eric J. Smith 编写,并且可以在 http://www.ericjsmith.net/codesmith 下载。

你可能感兴趣的:(.net)