CodeSmith模板引擎系列一

     在前些日子写了一些关于CodeDom的代码生成技术(目录),这里先感谢大家的支持和关注。我打算写一些代码生成编译技术的系列,包括CodeDom、CodeSmith模板、T4模板、StringTemplate,以及Expression Tree的系列随笔。如果可能的话再加上Emit系列。在这些系列中希望大家多关注,特别多多指教和交流。好了废话少说,今天就开始写CodeSmith模板。

     CodeSmith是一个基于模板的代码生成器,它可以生成任何基于ASCII的编程语言代码。生成的代码可以使用属性进行定制。属性可以是任何具有设计器的.NET对象(大多数.NET内置类型已经有设计器),也可以是一个允许你从结果中有条件地添加或移除代码的简单的boolean 属性,或是一个对象,例如能够访问数据库表信息的TableSchema对象(包括在SchemaExplorer中)。CodeSmith完全可扩展,它允许用户创建定制属性类型。CodeSmith中包括多个定制属性类型的例子,例如,定制一个允许选择XML文件(使用XmlSerializer可将其反序列化到对象中)的属性类型。CodeSmith还允许用户在模板中引用和调用指定的外部程序集并且允许从外部程序集的类生成模板。

CodeSmith的语法与ASP.NET几乎相同。因此如果你熟悉ASP.NET ,那么应该会很快理解模板语法。你可以在模板中使用C#、VB.NET或JScript.NET语言,并且模板可以输出任何基于ASCII的语言。CodeSmith还包括一个名为SchemaExplorer的程序集,利用它可以访问几乎所有的数据库概要(schema)细节。访问这种信息让你能够生成各种代码,例如存储过程、类型DataSet、业务对象、表示层代码或任何其它基于数据库概要信息的代码。(来自:http://msdn.microsoft.com/msdnmag/issues/04/07/MustHaveTools/default.aspx

      我们今天先来看看CodeSmith的固定头信息:

<%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Description" %>

上面声明了语言为c#(也可以使其他语言)输出为Text非调试状态的模板 
<%@ Assembly Name="System.Data" %>

上面Wie引入程序集System.Data相当于我们项目的添加引用 
<%@ Import Namespace="System.Data" %>

导入命名空间System.Data相当于我们c#的using

<%@ Property Name="NameSpace" Type="String"  Category="Context"  Description="Description" %>

上面为申明字符串的属性NameSpace。这个将会在CodeSmith的Properties框里显示输出参数。

     今天就写一个简单的,毫无意义的模板,根据CodeSmith的SchemaExplorer程序集输出数据库表信息:

 


代码

<%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema"  Category="Context" %>
<%--  -----------------------------------------------------------------
 -- Date Created: 
 -- Created By:   Generated by Wolf
 -------------------------------------------------------------------%>
<html>
<head>
    <title>CodeSmith Template</title>    
</head>
<body>
    <form id="form1" runat="server">
    <div>
 <table style="background-color: #FFFFCC; display: table"    cellpadding="0" cellspacing="0">
            <tr>
                <th>
                    ColumnName</th>
                <th>
                    DbType</th>
                <th>
                    DataType</th>
                <th>
                    Size</th>
                <th>
                    IsPrimaryKey</th>
                <th>
                    IsForeignKey</th>
                <th>
                    Unique</th>
            </tr>
            
            <% foreach(ColumnSchema col in SourceTable.Columns ) {%>
            <tr>
                <td>
                    <%= col.Name %></td>
                <td>
                    <%= col.NativeType %></td>
                <td>
                    <%= col.DataType %></td>
                <td>
                   <%= col.Size %></td>
                <td>
                    <%= col.IsPrimaryKeyMember %></td>
                <td>
                    <%= col.IsForeignKeyMember %></td>
                
                <td>
                    <%= col.IsUnique %></td>
            </tr>
            <% } %>
        </table>
    
    </div>
    </form>
</body>
</html>

  我们将输出导出为Html文件结果为:


今天就写到这里了,这个东西在我们的实际开发中毫无意义,只是拿来作为CodeSmith模板的HelloWorld示例,
请别拍砖。

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2010/07/13/1776379.html

时间: 2025-01-31 01:44:49

CodeSmith模板引擎系列一的相关文章

JavaEE开发之SpringBoot整合MyBatis以及Thymeleaf模板引擎

  使用thymeleaf布局 使用thymeleaf布局非常的方便 <footer th:fragment="copy"> © 2016 </footer>   在页面任何地方引入: <body> <div th:include="footer :: copy"></div> <div th:replace="footer :: copy"></div> <

浅谈Web中前后端模板引擎的使用

前言 这篇文章本来不打算写的,实话说楼主对前端模板的认识还处在非常初级的阶段,但是为了整个 源码解读系列 的完整性,在深入 Underscore _.template 方法源码后,觉得还是有必要记下此文,为了自己备忘也好,为了还没用上前端模板引擎的同学的入门也好.(熟悉模板引擎的可以帮楼主看看文中有没有 BUG ..) 后端 MVC 说起模板渲染,楼主首先接触的其实并不是前端模板引擎,而是后端.后端 MVC 模式中,一般从 Model 层中读取数据,然后将数据传到 View 层渲染(渲染成 HT

悠然乱弹:“最好的模板引擎”Beetl 剖析及与Tiny模板引擎对比

Beetl的环境搭建 输入命令 ? 1 git clone https://git.oschina.net/xiandafu/beetl2.0.git 不一会儿,输出了下面的内容 ? 1 2 3 4 5 6 7 Cloning into 'beetl2.0'... remote: Counting objects: 5807, done. remote: Compressing objects: 100% (2145/2145), done. remote: Total 5807 (delta

Tiny模板引擎(Velocity Plus)应用示例

把TinyTemplate当成是Velocity的升级版其实也是可以的,毕竟它的语法是基到Veloccity扩展而来的,兼容度在80%以上. 至于TinyTemplate的实例是怎样的,且看下面: 宏的可变参数 在Java中的可变参数使用起来非常方便,Tiny模板也对可变参有一定支持. ? 1 2 3 4 5 6 7 8 #macro hello() ParameterList: ${helloParameterList.size()}     #for(para:helloParameterL

PHP的常用的几大模板引擎

SmartySmarty的特点是将模板编译成PHP脚本,然后执行这些脚本.很快,非常灵活. Heyes Template Class一个非常容易使用,但功能强大并且快速的模板引擎,它帮助你把页面布局和设计从代码中分离. FastTemplate一个简单的变量插值模板类,它分析你的模板,把变量的值从HTML代码中分离处理. ShellPage一个简单易用的类,可以让你的整个网站布局基于模板文件,修改模板就能改变整个站点. STP Simple Template Parser一个简单.轻量级并且易于

分享25个顶级PHP模板引擎整理

为了找到一个好的模板引擎,我在互联网上进行搜索,目前已经整理出了以下名单: Smarty Smarty的特点是将模板编译成PHP脚本,然后执行这些脚本.很快,非常灵活. Heyes Template Class 一个非常容易使用,但功能强大并且快速的模板引擎,它帮助你把页面布局和设计从代码中分离. FastTemplate 一个简单的变量插值模板类,它分析你的模板,把变量的值从HTML代码中分离处理. ShellPage 一个简单易用的类,可以让你的整个网站布局基于模板文件,修改模板就能改变整个

二十五个顶级PHP模板引擎整理

   为了找到一个好的模板引擎,我在互联网上进行搜索,目前已经整理出了以下名单: Smarty   Smarty的特点是将模板编译成PHP脚本,然后执行这些脚本.很快,非常灵活. Heyes Template Class   一个非常容易使用,但功能强大并且快速的模板引擎,它帮助你把页面布局和设计从代码中分离. FastTemplate   一个简单的变量插值模板类,它分析你的模板,把变量的值从HTML代码中分离处理. ShellPage   一个简单易用的类,可以让你的整个网站布局基于模板文件

超越模板引擎

模板 总体来说,模板引擎是一个"好东西" 作为一个PHP/Perl的程序员,许多模板引擎(fastTemplate, Smarty, Perl的 HTML::Template)的用户,以及我自己的(bTemplate [1] 的作者),我讲这句话很多次了. 然而,在同事进行了长时间的讨论之后,我确信了大量的模板引擎(包括我自己写的)根本是错误的. 我想唯一的例外是Smarty [2],虽然我认为它太庞大了,并且考虑到这篇文章的其余部分相当的没有观点.然而,就你为什么选择Smarty(或

javascript模板引擎artTemplate的特性实现

文章简介:本文将用最简单的示例代码描述现有的 javascript 模板引擎的原理,包括新一代 javascript 模板引擎 artTemplate 的特性实现原理,欢迎共同探讨. 随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC 思想也开始流行起来.javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,近一年来在