CodeSmith学习(3)运行子模版

会对一类文件创建一个模版,比如Entity。然后调用数据库的表,每个表建立一个Entity实体的cs文件。如何实现呢?

首先我们将定义好Entity的模板。如下:

<%-- 
Name:
Author: 
Description: 
--%>
<%@ Template Language="C#" TargetLanguage="C#" %>

<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>

<%@ Property Name="NameSpace" Default="Beyondbit.Personal.Email" Type="System.String" %>
<%@ Property Name="表" Type="SchemaExplorer.TableSchema" Category="数据源"   Description="需要生成的表" %>

//----------------------------------------------------------------
// Copyright (C) 2012 上海互联网软件有限公司
// 版权所有。
// All rights reserved.
//
// 文件名:
// 文件功能描述:
// 
// 
// 创建标识:
//
// 修改标识:
// 修改描述:
//----------------------------------------------------------------

using System;

namespace <%=NameSpace%>.Entity
{
    /// <summary>
    /// 作者:Administrator 2012-06-27 3:29:59 PM
    /// </summary>
    [Serializable]
    public sealed class <%= 表.Name %> 
    {
        #region 私有成员变量
       <% for (int i = 0; i < 表.Columns.Count; i++) { %>   
            private <%=GetFieldType(表.Columns[i])%> _<%= 表.Columns[i].Name %>=<%=GetFieldValue(表.Columns[i])%>;
        <% } %>
        #endregion
        
        #region 成员属性
        <% for (int i = 0; i < 表.Columns.Count; i++) { %>   
        /// <summary>
        /// <%= 表.Columns[i].Name %>
        /// </summary>
        public <%=GetFieldType(表.Columns[i])%> <%= 表.Columns[i].Name %>
        {
            get { return _<%= 表.Columns[i].Name %>; }
            set { _<%= 表.Columns[i].Name %> = value; }
        }
        <% } %>
        #endregion
    }
}

<script runat="template">
  public string GetFieldType(ColumnSchema column)
  {
        string param = "String";
   
        switch (column.DataType)
        {
              case DbType.Int32:
              {
                   param ="int";
                   break;
             }
             default:
             {
                   
                   break;
             }
       }
  
       return param;
 }
  public string GetFieldValue(ColumnSchema column)
  {
        string param = "String.Empty";
   
        switch (column.DataType)
        {
              case DbType.Int32:
              {
                   param ="0";
                   break;
             }
             default:
             {
                   
                   break;
             }
       }
  
       return param;
 }
</script>
可以看到,该模版需要2个参数
NameSpace和表
接下来,我们看如何在另外一个模版中,用这个模版生成CS文件。
在另外一个模版中,如下设置:
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="System.Design" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Property Name="RootNamespace" Default="Test" Type="System.String" %>
<%@ Property Name="SourceDatabase" Type="SchemaExplorer.TableSchemaCollection" Category="数据源"   Description="需要生成的表" %>
<% 

//生成实体
 foreach (TableSchema table in SourceDatabase) 
 { 
    OutputSubTemplate(table); 
 } 

public void OutputSubTemplate(TableSchema table) 
{ 
	CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "Entity.cst"); 
         compiler.Compile(); 
	CodeTemplate  MySubTemplate= compiler.CreateInstance();
MySubTemplate.SetProperty("表", table); MySubTemplate.RenderToFile(OutputDirectory+RootNamespace+"/"+table.Name+"Entity.cs",true); }
%>

还有一种方法,直接在另外一个模版中直接注册子模版,如下设置:

Format:HTML FormatVersion:1.0StartHTML:     165EndHTML:   10171StartFragment:     314EndFragment:   10139StartSelection:     314EndSelection:     314

<%-- 
Name:
Author: 
Description: 
--%>
<%@ Template Language="C#" TargetLanguage="Text" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="System.Design" %>

<%@ Import Namespace="SchemaExplorer" %>

<%@ Property Name="RootNamespace" Default="Test" Type="System.String" %>
<%@ Property Name="SourceDatabase" Type="SchemaExplorer.TableSchemaCollection" Category="数据源"   Description="需要生成的表" %>
 <%-- 注册实体层Entity模板 --%>
<%@ Register Name="AssemblyInfoTemplate" Template="AssemblyInfo.cst" MergeProperties="Flase" ExcludeProperties=""%>

<% 
//生成实体
 foreach (TableSchema table in SourceDatabase) 
 { 
    OutputSubTemplate(table); 
 } 
 //生成项目
 CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "EntityProject.cst"); 
 compiler.Compile(); 
 CodeTemplate  ProjectTemplate = compiler.CreateInstance();
 
 ProjectTemplate.SetProperty("SourceDatabase",SourceDatabase);
 ProjectTemplate.SetProperty("RootNamespace",RootNamespace);
 
 ProjectTemplate.RenderToFile(OutputDirectory+RootNamespace+"/"+RootNamespace+".csproj",true);
 //生成AssemblyInfo
 ProjectTemplate= new AssemblyInfoTemplate();
 ProjectTemplate.SetProperty("RootNamespace",RootNamespace);
 
 ProjectTemplate.RenderToFile(OutputDirectory+ RootNamespace+"/Properties/AssemblyInfo.cs",true);
 
 //生成解决方案
 compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "SLN.cst"); 
 compiler.Compile(); 
 ProjectTemplate = compiler.CreateInstance();

 ProjectTemplate.SetProperty("RootNamespace",RootNamespace);
 
 ProjectTemplate.RenderToFile(OutputDirectory+ RootNamespace+".sln",true);
 %>
 <script runat="template"> 
 
 private string _outputDirectory = String.Empty;

[Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))] 
[Optional]
[Category("Output")]
[Description("The directory to output the results to.")]
public string OutputDirectory 
{
         get
         {
                   // default to the directory that the template is located in
                   if (_outputDirectory.Length == 0) return this.CodeTemplateInfo.DirectoryName + "output\\";

                   return _outputDirectory;
         }
         set
         {
                   if (!value.EndsWith("\\")) value += "\\";
                   _outputDirectory = value;
         } 
}
 
 
 private CodeTemplate _mySubTemplate;
 
[Browsable(false)]
public CodeTemplate MySubTemplate 
{ 
   get 
   { 
      if (_mySubTemplate == null) 
      { 
         CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "Entity.cst"); 
         compiler.Compile(); 
         if (compiler.Errors.Count == 0) 
         { 
            _mySubTemplate = compiler.CreateInstance(); 
         } 
         else 
         { 
            for (int i = 0; i < compiler.Errors.Count; i++) 
            {
               Response.WriteLine(compiler.Errors[ i].ToString()); 
            } 
         } 
      } 
      return _mySubTemplate; 
   } 
}

public void OutputSubTemplate(TableSchema table) 
{ 
   MySubTemplate.SetProperty("表", table); 
   MySubTemplate.RenderToFile(OutputDirectory+RootNamespace+"/"+table.Name+"Entity.cs",true);
    
  
} 
</script>

注意:Format:HTML FormatVersion:1.0StartHTML:     165EndHTML:     415StartFragment:     314EndFragment:     383StartSelection:     314EndSelection:     314

AssemblyInfoTemplate

是通过注册方式,引入的另外一个模版。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值