用CodeSmith生成自定义模板
2007-07-02 15:28
375 查看
当生成应用程序时,无论是编写数据访问代码还是生成自定义实体自定义集合,你会发现经常需要重复完成某些特定的任务。最近用CodeSmith编写了界面层到数据库访问层的模板以及用于生成存储过程的模板,感觉CodeSmith非常不错,不仅有利于提高团队的工作效率,自动完成那些最为乏味的任务,而且有利于让大家的代码保持一定的一致性和规范性。下面详细介绍一下如何生成自定义模板(以自定义实体为列),以作为总结,也希望对您有所帮助。
第一步是添加模板头,声明模板的语言、目标语言以及简要模板说明:
指明这是一个C#语言的模板。CodeSmith 包括一个名为 SchemaExplorer 的特殊的程序集,可用来从表、存储过程或几乎任何其他 SQL Server对象生成模板。下面引入该集合和命名空间:
第二步,属性声明,在这里可声明将在模板每次运行时指定的属性,以方便设置一系列需要传入的参数:
如上边所示,在进行代码生成时,在CodeSmith Explorer中选择模板后生成代码的窗口中,变量的名称为DataBase,类型是SchemaExplorer.DatabaseSchema,类别是Context,当用户选中这个属性时对于属性的描述Description。
如上边所示,变量的名称为TableName,NameSpace,类型是String,类别是Strings,当用户选中这个属性时对于属性的描述Description。
如上面所示,变量的名称为Author,Description,类型是String,类别为空(显示为“杂项”),当用户选中这个属性时对于属性的描述Description。
相应属性界面显示如下图所示:
第三步,编写C#语言模板类部分代码。CodeSmith模板脚本格式:
<script runat="template">
CodeTemplateRule rule=new CodeTemplateRule();
</script>
实例化类CodeTemplateRule。
函数作用:输入数据库名和表名,得到列集合信息。用内部函数ColumnSchemaCollection可以得到某张表的所有列的集合。
函数作用:对输入的表名格式化,得到去掉前缀的表名,如PE_User,返回User。
函数作用:得到表字段的类型。
函数作用:得到表字段的默认值。
函数作用:对输入的名称格式化,得到首字母为大写的名称,如user,返回User。
第四步,编写实际生成模板主体的代码,根据你需要的格式输出。代码如下:
最后,在CodeSmithStudio.exe运行模板 。填写你的参数,运行后就得到了你需要的实体代码:
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1534437
第一步是添加模板头,声明模板的语言、目标语言以及简要模板说明:
以下是代码片段: <%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Template description here." %> |
以下是代码片段: <%@ Assembly Name="System.Data" %> <%@ Import Namespace="System.Data" %> <%@ Assembly Name="SchemaExplorer" %> <%@ Import Namespace="SchemaExplorer" %> |
以下是代码片段: <%@ Property Name="DataBase" Type="SchemaExplorer.DatabaseSchema" Category="Context" Description="aaa" %> |
以下是代码片段: <%@ Property Name="TableName" Type="System.String" Default="" Optional="False" Category="Strings" Description="bbb" %> <%@ Property Name="NameSpace" Type="System.String" Default="" Optional="True" Category="Strings" Description="cccc" %> |
以下是代码片段: <%@ Property Name="Author" Type="System.String" Default="Author" Optional="False" Category="" Description="??" %> <%@ Property Name="Description" Type="System.String" Default="Description" Optional="False" Category="" Description="?????" %> |
相应属性界面显示如下图所示:
第三步,编写C#语言模板类部分代码。CodeSmith模板脚本格式:
<script runat="template">
CodeTemplateRule rule=new CodeTemplateRule();
</script>
以下是代码片段: CodeTemplateRule rule=new CodeTemplateRule(); public class CodeTemplateRule { |
以下是代码片段: public ColumnSchemaCollection GetColumnCollection(DatabaseSchema dataBase,string tableName) { TableSchemaCollection tables = new TableSchemaCollection(dataBase.Tables); ColumnSchemaCollection columns=null; for(int i=0;i<tables.Count;i++) { if(tables[i].Name.ToUpper()==tableName.ToUpper()) { TableSchema ts=tables[i]; columns=new ColumnSchemaCollection(ts.Columns); } } return columns; } |
以下是代码片段: public string GetTableName(string tableName) { int i=tableName.IndexOf("_"); return tableName.Substring(i+1,tableName.Length-(i+1)); } |
以下是代码片段: public string GetType(ColumnSchema column) { if (column.Name.EndsWith("TypeCode")) return column.Name; switch (column.DataType) { case DbType.AnsiString: return "string"; case DbType.AnsiStringFixedLength: return "string"; case DbType.Binary: return "byte[]"; case DbType.Boolean: return "bool"; case DbType.Byte: return "int"; case DbType.Currency: return "decimal"; case DbType.Date: return "DateTime"; case DbType.DateTime: return "DateTime"; case DbType.Decimal: return "decimal"; case DbType.Double: return "double"; case DbType.Guid: return "Guid"; case DbType.Int16: return "short"; case DbType.Int32: return "int"; case DbType.Int64: return "long"; case DbType.Object: return "object"; case DbType.SByte: return "sbyte"; case DbType.Single: return "float"; case DbType.String: return "string"; case DbType.StringFixedLength: return "string"; case DbType.Time: return "TimeSpan"; case DbType.UInt16: return "ushort"; case DbType.UInt32: return "uint"; case DbType.UInt64: return "ulong"; case DbType.VarNumeric: return "decimal"; default: { return "__UNKNOWN__" + column.NativeType; } } } |
以下是代码片段: public string GetDefaultValue(ColumnSchema column) { if (column.Name.EndsWith("TypeCode")) return column.Name; switch (column.DataType) { case DbType.AnsiString: return "/"/""; case DbType.AnsiStringFixedLength: return "/"/""; case DbType.Binary: return "null"; case DbType.Boolean: return "false"; case DbType.Byte: return "0"; case DbType.Currency: return "0"; case DbType.Date: return "DateTime.Parse(/"1900-1-1/")"; case DbType.DateTime: return "DateTime.Parse(/"1900-1-1/")"; case DbType.Decimal: return "0"; case DbType.Double: return "0"; case DbType.Guid: return "Guid.NewGuid().ToString()"; case DbType.Int16: return "0"; case DbType.Int32: return "0"; case DbType.Int64: return "0"; case DbType.Object: return "/"/""; case DbType.SByte: return "0"; case DbType.Single: return "0"; case DbType.String: return "/"/""; case DbType.StringFixedLength: return ""; case DbType.Time: return "DateTime.Parse(/"1900-1-1/")"; case DbType.UInt16: return "0"; case DbType.UInt32: return "0"; case DbType.UInt64: return "0"; case DbType.VarNumeric: return "0"; default: { return "__UNKNOWN__" + column.NativeType; } } } |
以下是代码片段: public string ConvPropertyName(string name) { return name.Substring(0,1).ToUpper() + name.Substring(1); } |
第四步,编写实际生成模板主体的代码,根据你需要的格式输出。代码如下:
以下是代码片段: using System; using System.Collections.Generic; using System.Text; namespace PowerEasy.Model.<%= NameSpace %> { /// <summary> /// Description:<%= Description %> ///</summary> public class <%= rule.ConvPropertyName(rule.GetTableName(TableName)) %>Info { ///<summary> ///<%= Description %> ///</summary> public <%= rule.ConvPropertyName(rule.GetTableName(TableName)) %>Info() { } <% ColumnSchemaCollection columns=rule.GetColumnCollection(DataBase,TableName); for(int i=0;i<columns.Count;i++) { Response.Write(" //"+columns[i].Description+"/r/n"); Response.Write(" private "+rule.GetType(columns[i])+" m_"+columns[i].Name+";/r/n"); } %> #region <% for(int i=0;i<columns.Count;i++) { %> ///<summary> ///<%= columns[i].Description %> ///</summary> public <%= rule.GetType(columns[i]) %> <%= rule.ConvPropertyName(columns[i].Name) %> { get { return m_<%= columns[i].Name %>; } set { m_<%= columns[i].Name %>=value; } } <% } %> #endregion } } |
以下是引用片段: using System; using System.Collections.Generic; using System.Text; namespace AAA { /// <summary> /// Description:BBB实体 ///</summary> public class OrderInfo { ///<summary> ///Description ///</summary> public OrderInfo() { } //订单ID private int m_OrderId; //订单编号 private string m_OrderNum; //用户名 private string m_UserName; //代理商名 private string m_AgentName; //客户ID private int m_ClientId; //订单总金额 private decimal m_MoneyTotal; //购买商品合计金额 private decimal m_MoneyGoods; //是否需要开发票 private bool m_NeedInvoice; //发表内容,包括抬头、商品名称、金额等 private string m_InvoiceContent; //是否已开发票 private bool m_Invoiced; //备注 private string m_Remark; //已收款 private decimal m_MoneyReceipt; //开始服务日期 private DateTime m_BeginDate; //录入时间 private DateTime m_InputTime; //受货人姓名 private string m_ContacterName; //收货人地址 private string m_Address; //邮编 private string m_ZipCode; //手机 private string m_Mobile; //联系电话 private string m_Phone; //EMAIL private string m_Email; //付款方式 private int m_PaymentType; //送货方式 private int m_DeliverType; //订单状态 private int m_Status; //物流状态 private int m_DeliverStatus; //是否开通下载 private bool m_EnableDownload; //返还的现金券 private decimal m_PresentMoney; //赠送点券 private int m_PresentPoint; //得到的积分 private int m_PresentExp; //付款方式的折扣 private double m_Discount_Payment; //运费 private decimal m_Charge_Deliver; private string m_ClientName; #region ///<summary> ///订单ID ///</summary> public int OrderId { get { return m_OrderId; } set { m_OrderId = value; } } ///<summary> ///订单编号 ///</summary> public string OrderNum { get { return m_OrderNum; } set { m_OrderNum = value; } } ///<summary> ///用户名 ///</summary> public string UserName { get { return m_UserName; } set { m_UserName = value; } } ///<summary> ///代理商名 ///</summary> public string AgentName { get { return m_AgentName; } set { m_AgentName = value; } } ///<summary> ///客户ID ///</summary> public int ClientId { get { return m_ClientId; } set { m_ClientId = value; } } ///<summary> ///订单总金额 ///</summary> public decimal MoneyTotal { get { return m_MoneyTotal; } set { m_MoneyTotal = value; } } ///<summary> ///购买商品合计金额 ///</summary> public decimal MoneyGoods { get { return m_MoneyGoods; } set { m_MoneyGoods = value; } } ///<summary> ///是否需要开发票 ///</summary> public bool NeedInvoice { get { return m_NeedInvoice; } set { m_NeedInvoice = value; } } ///<summary> ///发表内容,包括抬头、商品名称、金额等 ///</summary> public string InvoiceContent { get { return m_InvoiceContent; } set { m_InvoiceContent = value; } } ///<summary> ///是否已开发票 ///</summary> public bool Invoiced { get { return m_Invoiced; } set { m_Invoiced = value; } } ///<summary> ///备注 ///</summary> public string Remark { get { return m_Remark; } set { m_Remark = value; } } ///<summary> ///已收款 ///</summary> public decimal MoneyReceipt { get { return m_MoneyReceipt; } set { m_MoneyReceipt = value; } } ///<summary> ///开始服务日期 ///</summary> public DateTime BeginDate { get { return m_BeginDate; } set { m_BeginDate = value; } } ///<summary> ///录入时间 ///</summary> public DateTime InputTime { get { return m_InputTime; } set { m_InputTime = value; } } ///<summary> ///受货人姓名 ///</summary> public string ContacterName { get { return m_ContacterName; } set { m_ContacterName = value; } } ///<summary> ///收货人地址 ///</summary> public string Address { get { return m_Address; } set { m_Address = value; } } ///<summary> ///邮编 ///</summary> public string ZipCode { get { return m_ZipCode; } set { m_ZipCode = value; } } ///<summary> ///手机 ///</summary> public string Mobile { get { return m_Mobile; } set { m_Mobile = value; } } ///<summary> ///联系电话 ///</summary> public string Phone { get { return m_Phone; } set { m_Phone = value; } } ///<summary> ///EMAIL ///</summary> public string Email { get { return m_Email; } set { m_Email = value; } } ///<summary> ///付款方式 ///</summary> public int PaymentType { get { return m_PaymentType; } set { m_PaymentType = value; } } ///<summary> ///送货方式 ///</summary> public int DeliverType { get { return m_DeliverType; } set { m_DeliverType = value; } } ///<summary> ///订单状态 ///</summary> public int Status { get { return m_Status; } set { m_Status = value; } } ///<summary> ///物流状态 ///</summary> public int DeliverStatus { get { return m_DeliverStatus; } set { m_DeliverStatus = value; } } ///<summary> ///是否开通下载 ///</summary> public bool EnableDownload { get { return m_EnableDownload; } set { m_EnableDownload = value; } } ///<summary> ///返还的现金券 ///</summary> public decimal PresentMoney { get { return m_PresentMoney; } set { m_PresentMoney = value; } } ///<summary> ///赠送点券 ///</summary> public int PresentPoint { get { return m_PresentPoint; } set { m_PresentPoint = value; } } ///<summary> ///得到的积分 ///</summary> public int PresentExp { get { return m_PresentExp; } set { m_PresentExp = value; } } ///<summary> ///付款方式的折扣 ///</summary> public double DiscountPayment { get { return m_Discount_Payment; } set { m_Discount_Payment = value; } } ///<summary> ///运费 ///</summary> public decimal ChargeDeliver { get { return m_Charge_Deliver; } set { m_Charge_Deliver = value; } } ///<summary> ///客户姓名 ///</summary> public string ClientName { get { return m_ClientName; } set { m_ClientName = value; } } #endregion } } |
相关文章推荐
- 用CodeSmith生成自定义模板
- CodeSmith 5.0工具实例篇系列1——根据表生成单个实体类的模板
- CodeSmith模板(生成数据访问层)
- 【Sublime】使用Sublime3的Snippet生成自定义模板
- EF 生成实体类的同时生成自定义扩展类的模板编写方法
- CodeSmith编写ibatisnet生成模板
- IntelliJ IDEA 自定义创建类生成注释模板
- 存储过程中的参数自动生成函数参数,表中的列自动生成函数参数 CodeSmith模板
- Codesmith根据模板批量生成代码
- codesmith自定义模板之实体层
- C#"CodeSmith代码批量生成模板"制作经验分享
- 关于codesmith的一点使用--自动生成数据库中所有表的存储过程使用模板
- Discuz!NT 2.5 生成自定义模板时出错,报数组越界
- CodeSmith 使用教程(15) 为Yii Framework 创建生成ActiveRecord的代码模板
- YII入门 (4) -- 自定义Gii生成代码模板
- CodeSmith将模板文件批量生成文件的方法 - 空空如也 - 博客园
- Database2Sharp版本更新之自定义模板生成
- Yii2 自定义Gii生成代码模板
- 生成实体类和数据库操作类(基于SQL语句而不是存储过程)的CodeSmith模板
- CodeSmith将模板文件批量生成文件的方法