CodeSmith学习(3)运行子模版

来源:互联网 发布:河南管家婆软件 编辑:程序博客网 时间:2024/04/29 08:16

会对一类文件创建一个模版,比如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

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

原创粉丝点击