日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何使用CodeSmith批量生成代码

發布時間:2025/6/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用CodeSmith批量生成代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在上一篇我們已經用PowerDesigner創建好了需要的測試數據庫,下面就可以開始用它完成批量代碼生成的工作啦.

下面我會一步步的解釋如何用CodeSmith實現預期的結果的,事先聲明一下,在此只做一個簡單的Demo,并不詳細的講解CodeSmith各個強大的功能,有興趣的朋友可以打開CodeSmith的幫助文檔了解.我只做個拋磚引玉,希望能激起大家更多思想的火花~

先看看CodeSmith的工作原理:

簡單的說:CodeSmith首先會去數據庫獲取數據庫的結構,如各個表的名稱,表的字段,表間的關系等等,之后再根據用戶自定義好的模板文件,用數據庫結構中的關鍵字替代模板的動態變量,最終輸出并保存為我們需要的目標文件.好,原理清楚了,就開始實踐吧:

1. 運行CodeSmith,可以看到如下界面:

2. CodeSmith是創建模板的地方,首先當然是創建一個模板啦,點擊工具欄最左邊的New DocumentC# Template,如圖所示:

?

3. 點擊運行按鈕,運行結果如下:

好,我們來分析為什么會得到這樣的運行結果吧,點擊運行窗口左下角的Template按鈕返回模板設計窗口,可以發現,只要是沒有被<%%>或者<scriptrunat="template"></script>包含的文字均被直接輸出了,這些以后就要被換成我們分層架構中一些一成不變的模板代碼:

4. 好了,簡單了解啦一些CodeSmith的代碼結構,下面就開始用它來生成我們的分層代碼吧,在此我就不介紹分層架構的概念了,不然就偏離主題了.為了能更簡單明了的說明,我們在此就只用CodeSmith生成分層架構的實體層吧.先看看如果我們不使用CodeSmith需要手動敲出哪些代碼:

Major.cs

using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;

namespace?Entity
{
publicpartialclass?Major
{
publicInt32 MajorID{?get;set; }
publicString Name{?get;set; }
publicString Remark{?get;set; }
}
}

Student.cs

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Entity 7 { 8 publicpartialclass Student 9 { 10 publicString StudentID{ get;set; } 11 publicInt32 MajorID{ get;set; } 12 publicString Name{ get;set; } 13 publicBoolean Sex{ get;set; } 14 publicInt32 Age{ get;set; } 15 publicString Remark{ get;set; } 16 } 17 }

?

我將兩個文件中重復的代碼使用黃色背景色加深了,我們可以發現,如果每個表都要通過手動創建,那么將有大量的代碼(黃色背景)需要復制粘貼操作,這些操作是繁瑣而沒有任何意義的.因此,我們會希望將黃色背景部分的代碼做成模板,而其他變化的代碼由數據庫的結構動態生成,如此一來,我們就不用再為這些煩人的復制粘貼操作懊惱了.

5. 那么就開始我們的實踐吧,就在剛剛創建好的文件開始吧,先隨意保存到一個目錄下,命名為test.cst,接著刪除多余的代碼,只保留第一行,該行表明我們的模板使用何種語言,這里我們使用C#.

<%@ CodeTemplateLanguage="C#"?TargetLanguage="Text"?Src=""?Inherits=""Debug="False"?CompilerVersion="v3.5"Description="Template description here."%>

6. 參照CodeSmith的工作原理,我們首先要為CodeSmith提供一個數據庫,要怎么使它和SQL Server 2005關聯起來呢?只要加上下面的代碼就行了:

<%--?加載訪問數據庫的組件SchemaExplorer,并聲明其使用的命名空間?--%>
<%@ AssemblyName="SchemaExplorer"%>
<%@ ImportNamespace="SchemaExplorer"%>

<%--?數據庫?--%>
<%@ PropertyName="SourceDatabase"DeepLoad="True"?Optional="False"?Category="01. GettingStarted - Required"?Description="Database that the tables views, and storedprocedures should be based on. IMPORTANT!!! If SourceTables and SourceViews areleft blank, the Entire Database will then be generated."%>

7. 好了,有了數據庫連接,接著還需要一個模板,為了便于管理,我們新建一個文件用于設計模板,FileNewBlank? Template,并添加如下代碼,最好保存到test.cst所在的文件夾內,命名為Entity.cst:

<%@ CodeTemplateInherits="CodeTemplate"TargetLanguage="Text"?Description="NetTiers main template."Debug="True"?ResponseEncoding="UTF-8"%>

<%@ AssemblyName="SchemaExplorer"?%>
<%@ ImportNamespace="SchemaExplorer"?%>

<%--?要打印的表?--%>
<%@ PropertyName="Table"?DeepLoad="True"Optional="False"?Category="01. Getting Started - Required"Description="Database that the tables views, and stored procedures shouldbe based on. IMPORTANT!!! If SourceTables and SourceViews are left blank, theEntire Database will then be generated."?%>

接著繼續添加如下代碼:

using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;

namespace?Entity
{
publicpartialclass<%=?Table.Name%>
{
<%foreach(ColumnSchema col inTable.Columns){?%>
public<%=?col.DataType?%><%=col.Name?%>{?get;set; }
<%?}?%>
}
}

<%=Table.Name%>????????? 表示在此處輸出表的名稱

<%foreach(ColumnSchema col in Table.Columns){ %> <% } %>?????? 為循環語句,在{}循環輸出列信息.

<%=col.DataType %>?????? 表示在此處輸出列的類型

<%=col.Name %>???????????? 表示在此處輸出列的名稱

如圖所示:

8. 模板創建好后,要在test.cst文件中注冊一下,不然人家怎么知道有你這么一個模板存在呀,在test.cst文件繼續輸入如下代碼:

<%--?注冊實體層Entity模板?--%>
<%@ RegisterName="EntityTemplate"?Template="?Entity.cst"MergeProperties="Flase"?ExcludeProperties=""%>

9. 好了,模板注冊好了,根據CodeSmith工作原理,我們要結合模板和數據庫結構來批量生成代碼啦,但是我們生成的目標文件要輸出到哪里呢?這時我們會需要一個用戶自定義屬性,用于設置目標文件的輸出目錄,在test.cst文件的末尾輸入如下代碼:

代碼

10. 現在連輸出目錄也有了,該想辦法寫些函數來完成將數據庫架構傳遞給模板的工作啦,在test.cst文件的末尾輸入如下代碼:

代碼

CodeTemplateTemplate = new EntityTemplate();  就是創建了一個新的模板

foreach(TableSchematable in this. SourceDatabase.Tables){}??? 表示循環輸出數據庫中的表

Template.SetProperty("Table",table);???????????????????????? 就是向模板設置屬性,還記得我們在Entity.cst里面設置了一個Table屬性嗎,我們就是通過這個方法給這個屬性設值的.

Template.RenderToFile(FileDirectory,true);??????????? ?? 表示將Temlate里的內容全部輸出到FileDirectory目錄中,true表示如果文件存在直接覆蓋.

11. 函數寫好了,離成功不遠啦,我們在test.cst的最后再添加如下代碼,用于調用剛剛寫好的函數.至此,模板文件的制作已經完成.

<%
//創建實體層Entity類
this.GenerateEntityClasses();

Debug.WriteLine("OK");
%>

12. 好啦,現在只要設置我們要導出的數據庫和輸出目錄就可以運行看結果啦,點擊CodeSmith主窗體右下角Properities面板中SourceDatabase屬性欄右側的…按鈕,彈出數據庫設置對話框,我們要在此添加一個新的數據庫連接:

13. 點擊Add按鈕,屬性設置如圖,我們選擇的是在前一章用PowerDesigner創建好的PD_test數據庫:

14. 點擊OK,回到數據庫選擇對話框,選擇剛剛創建好的數據庫連接:

15. 接著是設置目標文件輸出目錄,我在這里設置為桌面的一個新建文件夾:

16. OK,萬事俱備,可以點擊運行按鈕讓CodeSmith為我們批量生成代碼啦:

打開生成的文件,就可以看到我們期待看到的代碼啦:

好了,這些是基礎,但是只要你掌握了這些就可以開始自己的CodeSmith之旅啦,我也只能送大家到此咯~其他更多的知識點希望大家能自行查看幫助文章或者上網查詢,很高興又和大家分享了自己的一點心得,接下來想再回頭復習一下設計模式,也打算寫一些文章,歡迎大家關注~

上述實踐中的文件源代碼:

1 <%@ CodeTemplate Inherits="CodeTemplate" Language="C#" TargetLanguage="Text" Description="NetTiers main template." Debug="True" ResponseEncoding="UTF-8"%> 2 3 4 <%-- 注冊實體層Entity模板 --%> 5 <%@ Register Name="EntityTemplate" Template="WinformTier\Entity.cst" MergeProperties="Flase" ExcludeProperties=""%> 6 7 8 <%-- 數據庫 --%> 9 <%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" DeepLoad="True" Optional="False" Category="01. Getting Started - Required" Description="Database that the tables views, and stored procedures should be based on. IMPORTANT!!! If SourceTables and SourceViews are left blank, the Entire Database will then be generated."%> 10 11 12 <% 13 //創建實體層Entity類 14 this.GenerateEntityClasses(); 15 16 Debug.WriteLine("OK"); 17 %> 18 19 <script runat="template"> 20 //生成實體Entity類 21 privatevoid GenerateEntityClasses() 22 { 23 CodeTemplate Template =new EntityTemplate(); 24 foreach(TableSchema table inthis.SourceDatabase.Tables) 25 { 26 string FileDirectory = OutputDirectory +"\\"+ table.Name +".cs"; 27 //生成模板 28 Template.SetProperty("Table",table); 29 //文件輸出 30 Template.RenderToFile(FileDirectory,true); 31 Debug.WriteLine(FileDirectory +" 創建成功."); 32 } 33 } 34 </script> 35 36 37 <script runat="template"> 38 //解決方案輸出路徑 39 privatestring Directory = String.Empty; 40 41 [Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))] 42 [Optional, NotChecked] 43 [DefaultValue("")] 44 publicstring OutputDirectory 45 { 46 get 47 { 48 return Directory; 49 } 50 set 51 { 52 if (value.EndsWith("\\")) value = value.Substring(0, value.Length -1); 53 Directory = value; 54 } 55 } 56 </script> View Code 1 <%@ CodeTemplate Inherits="CodeTemplate" Language="C#" TargetLanguage="Text" Description="NetTiers main template." Debug="True" ResponseEncoding="UTF-8"%> 2 3 <%@ Assembly Name="SchemaExplorer"%> 4 <%@ Import Namespace="SchemaExplorer"%> 5 6 <%@ Property Name="Table" Type="TableSchema" DeepLoad="True" Optional="False" Category="01. Getting Started - Required" Description="Database that the tables views, and stored procedures should be based on. IMPORTANT!!! If SourceTables and SourceViews are left blank, the Entire Database will then be generated."%> 7 using System; 8 using System.Collections.Generic; 9 using System.Linq; 10 using System.Text; 11 12 namespace Entity 13 { 14 publicpartialclass<%= Table.Name%> 15 { 16 <%foreach(ColumnSchema col in Table.Columns){ %> 17 public<%= col.DataType %><%= col.Name %>{ get;set; } 18 <% } %> 19 } 20 } Entity.cst

?

總結

以上是生活随笔為你收集整理的如何使用CodeSmith批量生成代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕精品一区二区精品 | 四虎影视www在线播放 | 少妇激情偷人爽爽91嫩草 | 黄色精品视频在线观看 | 天堂网wwww | 色丁香综合| 日韩视频网站在线观看 | 午夜影院试看 | 中文字幕第页 | 99成人国产精品视频 | 午夜高潮视频 | 国产精品无码电影 | 伊人网视频在线 | 精品动漫一区二区三区的观看方式 | 亚洲黄在线观看 | 国产精品一区二区久久毛片 | 7色av | 日韩一区二区三区在线观看 | 美女日批在线观看 | 国产免费无遮挡 | va婷婷在线免费观看 | av不卡免费在线 | 婷婷综合五月天 | 天堂av资源在线观看 | 99在线精品视频免费观看20 | 色桃av| 边打电话边做 | 天天干天天日夜夜操 | 在线免费观看一区二区三区 | 国产山村乱淫老妇女视频 | 96亚洲精品久久久蜜桃 | 亚洲精品成人av | 久久av红桃一区二区小说 | 国产精品原创 | 欧美大浪妇猛交饥渴大叫 | 在线成人欧美 | 亚洲天堂精品视频 | 麻豆视频二区 | 高潮av在线| 成年人在线网站 | 婷婷一级片 | 久久国产精品-国产精品 | 精品国产aⅴ麻豆 | 国产精品视频成人 | 国产精品扒开腿做爽爽 | 依人在线| 久草电影在线 | 成人a毛片久久免费播放 | 亚洲成人自拍视频 | 国产精品一区二区三区在线看 | 伊人国产女 | 欧美日韩精品三区 | 精品人妻视频在线 | 可以直接看的无码av | 久草国产精品 | 男人天堂网av | 亚洲dvd | 视频黄页在线观看 | 成人性生交免费看 | 各处沟厕大尺度偷拍女厕嘘嘘 | 性猛交xxxx乱大交3 | 亚洲一区精品在线 | 激情欧美一区二区三区 | 国产大屁股喷水视频在线观看 | 国产人妻人伦精品1国产 | 致命弯道8在线观看免费高清完整 | 毛片毛片毛片毛片毛片 | 不卡中文字幕av | 男女激情视频网站 | 黄色网址哪里有 | 欧美日韩视频无码一区二区三 | 初尝情欲h名器av | 人妻一区二区视频 | 日本一区二区在线 | 色av网 | 9191av| 亚洲深夜福利 | 欧美成人精品一区二区三区在线观看 | 午夜少妇影院 | 黄频在线免费观看 | 91蜜桃婷婷狠狠久久综合9色 | 成人少妇影院yyyy | 亚洲成人www | 天天干天天操天天拍 | 98成人网| 亚洲av少妇一区二区在线观看 | 欧美日韩国产精品一区 | 波多野结衣之潜藏淫欲 | 国产中文字幕一区二区三区 | 人人干人人搞 | 龚玥菲三级露全乳视频 | 丰满放荡岳乱妇91ww | 日本护士体内she精2xxx | 精品国产一区二区三区久久久蜜月 | 久久亚洲精品中文字幕 | 色女人综合 | 亚洲中文字幕一区 | 小嫩女直喷白浆 | 成人国产av一区二区三区 |