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();MySubTemplate.SetProperty("表", table); MySubTemplate.RenderToFile(OutputDirectory+RootNamespace+"/"+table.Name+"Entity.cs",true); }CodeTemplate MySubTemplate= compiler.CreateInstance();%>
还有一种方法,直接在另外一个模版中直接注册子模版,如下设置:
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
是通过注册方式,引入的另外一个模版。
- CodeSmith学习(3)运行子模版
- CodeSmith 创建Ado.Net自定义模版(一)
- CodeSmith 创建Ado.Net自定义模版(二)
- CodeSmith 创建Ado.Net自定义模版(三)
- CodeSmith 创建Ado.Net自定义模版(四)
- CodeSmith的模版中的语法
- CodeSmith template模版资源(转载)
- CodeSmith的基础模版类
- CodeSmith学习
- CodeSmith 学习(1)简介下载安装
- CodeSmith学习(4) .net站点结构
- CodeSmith学习文章
- CodeSmith基本学习【1】
- CodeSmith 学习积累
- CodeSmith学习笔记
- codesmith学习总结
- STL模版学习(转载)
- CodeSmith基础(一)
- 使用完整jqGrid作为子表格
- 旋转方阵java编写
- c++中类型转换机制
- 2013 腾讯马拉松专题
- 快速排序算法的深入分析
- CodeSmith学习(3)运行子模版
- sql server时间范围查询语句
- 关于Android apk 插件化开发
- 3.java.lang.NullPointerException异常处理方法
- Understanding GC pauses in JVM, HotSpot's minor GC.
- Xcode WorkSpace的使用与编译
- 2011国信蓝点杯全国软件设计大赛
- C#生成随机字符串
- java实现把一个大文件切割成N个固定大小的文件