使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM