zoukankan      html  css  js  c++  java
  • 使用CodeSmith 生成代码

    CodeSmith是一款优秀的代码生成工具。在ORM中,它能帮助我们生成实体类、XML配置文件,从而简化了我们一部分的开发工作。下面简要说说它的基本用法。

    1、  打开CodeSmith,创建一个模板

    File->New->CSharp Template 。创建的模板内容如下图

    模板中SampleStringProperty 和 SampleBooleanProperty都是声明的变量,在下边代码中都可以用到该变量,我们可以把该模板看做是一个HTML页面,没有用标签圈起来的代码和用<%= %>内部的代码都可以输出到界面上。其中<%= %>与aspx页面中的用法一致。

    2、编译代码,给声明的变量赋值

    点击红色方框圈住的按钮即可编译模板,模板编译通过后右侧会出现一个Properties的框,在这里面我们可以给我们在模板中定义的变量赋值,如下图所示。

    3、运行模板

    4、根据数据库生成对应实体层的代码

    1、连接数据库

    我们创建一个localhost的数据库连接,方法如下图

    2、新建一个Entity.cst模板,编写如下模板代码

    <%@ CodeTemplate Language="C#" TargetLanguage="C#" ResponseEncoding="UTF-8" Debug="False" Description="生成数据库实体" %>
    <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="属性" Description="要生成实体的数据表" %>
    <%@ Property Name="NameSpace" Type="System.String" Optional="False" Default="Modul" Category="属性" Description="实体类所在的命名空间" %>
    
    <%@ Map Name="CSharpAlias" Src="System-CSharpAlias" Description="System to C# Type Map" %>
    <%@ Assembly Name="SchemaExplorer" %>
    <%@ Import Namespace="SchemaExplorer" %>
    
    <%--*本代码由代码生成器自动生成,请不要更改此文件的任何代码。
    *生成时间:<%= DateTime.Now.ToLocalTime() %>
    *生成者:<%= opuser %>--%>
    using System;
    namespace <%= this.NameSpace+".Entity.Entities" %>
    {
        ///<summary>
        ///<%= this.SourceTable.Name %>的实体类
        ///</summary>
        public class <%= this.SourceTable.Name %>
        {
            <% foreach(ColumnSchema column in this.SourceTable.Columns){%>    
             <%--生成get set 方法--%>
            /// <summary>
            /// <%= string.IsNullOrEmpty(column.Description)?StringUtil.ToCamelCase(column.Name):column.Description  %>
            /// </summary>
            public virtual <%= CSharpAlias[column.SystemType.FullName] %> <%= StringUtil.ToPascalCase(column.Name) %>
            {
                get;set;
            }
            
            <%}%>
        }
    }

    在该模板中我们定义了两个变量:SourceTable--该变量存储需要生成的数据库表,NameSpace--生成的代码中对应的命名空间。

    3、编译代码,在属性窗口中给SourceTable和NameSpace变量赋值,如下图

    4、点击运行即可看到生成的代码。

    5、生成的代码存储到指定的文件夹

    1、添加一个Main.cst模板,并编写如下代码。

    Main.cst与Entity.cst在同一个目录下。代码中有比较全的注释,可以仔细看一下。

    <%-- 
    Name:
    Author: 
    Description: 
    --%>
    <%@ Template Language="C#" TargetLanguage="Text" %>
    
    <%-- 注册实体层Entity模板 --%>
    <%@ Register Name="EntityTemplate" Template="Entity.cst" MergeProperties="False" %>
    
    
    <%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" DeepLoad="True" Optional="False" Description="存数数据库" %>
    <%@ Property Name="NameSpace" Type="System.String" Default="BitCar.Finance.CC" Optional="False" Description="命名空间" %>
    
    <%
    //创建实体层Entity类
    this.GenerateEntityClasses();
    
    Debug.WriteLine("OK");
    %>
    
    <script runat="template">
    //生成实体Entity类
    private void GenerateEntityClasses()
    {
        CodeTemplate Template =new EntityTemplate();//实体
        //循环数据数据库中的表
        foreach(TableSchema table in this.SourceDatabase.Tables)
        {
            string FileDirectory = OutputDirectory +"\Mode\Entities\"+ table.Name +".cs";
            //给Entity.cst模板中的变量SourceTable 赋值
            Template.SetProperty("SourceTable",table);
            //给Entity.cst模板中的变量NameSpace 赋值
             Template.SetProperty("NameSpace",NameSpace);
            //文件输出
            Template.RenderToFile(FileDirectory,true);
            Debug.WriteLine(FileDirectory +" 创建成功.");
        }
    }
    
    </script>
    
    <script runat="template">
    //代码模板输出路径,编译后可以在属性窗口中选择
    private string Directory = String.Empty;
    
    [Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))] 
    [Optional, NotChecked]
    [DefaultValue("")]
    public string OutputDirectory 
    { 
    get
    {
    return Directory;
    }
    set
    {
    if (value.EndsWith("\")) value = value.Substring(0, value.Length -1);
    Directory = value;
    } 
    }
    </script>
    <%="全部生成成功" %>

    该模板中定义了三个变量:Namespace--指定生成的代码的命名空间,SourceDatabase--存储数据库,Directory--指定生成代码存储的路径(该变量在模板底部定义)

    2、编译模板,在属性窗口中给变量赋值,然后生成即可看到生成的代码。

     

    原文参考:http://www.cnblogs.com/huangcong/archive/2010/06/14/1758201.html

  • 相关阅读:
    TFS的安装
    反射发出动态类型介绍(上)
    搭建基于SSI(struts2,spring,ibatis)的javaEE开发环境
    国内各大互联网公司相关技术站点2.0版
    第三部分 静态链接(一)
    谁删除了某个表
    迷你MVVM框架 avalonjs 0.85发布
    POJ 2367 Genealogical tree
    修改进程占用内存SetProcessWorkingSetSize函数(多篇相关文章值得学习)
    使用TWebBrowser时存在内存泄漏问题的解决方案(使用SetProcessWorkingSetSize函数,或者修改OleCtrls.pas源码解决问题)
  • 原文地址:https://www.cnblogs.com/lc-chenlong/p/4191725.html
Copyright © 2011-2022 走看看