C#CodeSmith代码批量生成模板制作经验分享
?????? 最近忙的有些一頭霧水,原本定的計劃:每周寫一篇技術文章,也被整的‘擱淺’了。今天感覺怎么著也得寫一篇,要不這個計劃可能又很難堅持下去了(ps: 寫東西,不僅要時間,更重要的是心情——能靜下心去寫)。直接說正題,——代碼生成器,應該是每個程序員必備的工具,無論你是做什么開發 或 使用的那種編程語言,它都能在很大程度上為你節省不少時間;而做C#開發的,可選的代碼生成器,可能要更多 ——用的比較多、好用的 有: CodeSmith,動軟代碼生成器...。在這里,先簡要的說下 我對這兩種工具的使用感受:a. CodeSmith是我常用的,比較好用 ,可以很好的支持mysql,mssql,access等數據庫的三層代碼類 和數據庫表的相關存儲過程等,其模板(制作)語言比較簡單易用,缺點:目前網上可用的 和其默認的模板,都不支持批量生成代碼類,即每次只能生成一個表的對應模板類。b.動軟代碼生成器, 跟CodeSmith比,其優點在于:開源免費,可以批量生成,缺點(僅針對于我下載使用的,或者說是我個人的看法):對access數據庫的支持不好(無法生成),其它的它們到底哪個更功能強大或好用,這里就不再討論和深究。
????? 之前,在做配餐系統開發時,因一開始數據庫中的表不多,就10個左右,用CodeSmith一個個去生成相關類,雖感覺有些麻煩,但也沒想著找個能一次性搞定的方法,就有些‘麻木’的用著。而最近,需要在已做好的配餐系統中增加一個新的模塊 ——此模塊差不多要新建6個左右的數據庫表。表增加了,那些可以用CodeSmith生成的類,自然需要一個個去生成,再加上數據庫表并不是一下就能定好的,增改字段都是很正常的事,這樣,就突然感覺,如果在do like this(如此操作),會浪費不少時間,也麻煩,于是,想偷懶,省事 ——(ps:呵呵...,不得不說很多工具正是因為人們想偷懶省事而創造出來。)就自然而然需要想辦法實現‘代碼批量’生成。 先上網找找看,一搜“CodeSmith代碼批量生成模板”,卻基本上沒有此類信息,還好看到一個網友寫的一篇“CodeSmith代碼批量生成模板”測試類的文章,看后,有些收獲,按其方法 將自己的模板修改后,批量生成模板搞定。現將模板 和 制作方法 貼出,希望對需要的朋友有些幫助!
??? 1. 批量生成模板:BatchCreate.cst
?
<%--作者:know@more
Blog:http://www.cnblogs.com/know/
--%>
<%@ CodeTemplate Inherits="CodeTemplate" Language="C#" TargetLanguage="Text" Description="NetTiers main template." Debug="True" ResponseEncoding="UTF-8"%>
<%-- 注冊模板類start --%>
<%-- 注冊實體層Entity模板 --%>
<%@ Register Name="EntityTemplate" Template="DBMad.Models.cst" MergeProperties="Flase" ExcludeProperties=""%>
<%-- 注冊業務邏輯層Business模板 --%>
<%@ Register Name="BusinessTemplate" Template="DBMad.BLL.cst" MergeProperties="Flase" ExcludeProperties=""%>
<%-- 注冊模板類end --%>
<%-- 模板屬性start --%>
<%-- 數據庫 --%>
<%@ 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." %>
<%-- 命名空間 --%>
<%@ Property Name="MainNamespace" Default="MyPro" Type="System.String" Category="Context" Description="Your project name if you want use to Namespace!" %>
<%@ Property Name="ModelNamespace" Default="Model" Type="System.String" Category="Context" Description="this layer Namespace Name" %>
<%-- 模板屬性end --%>
<%
if(this.OutputDirectory=="" || !System.IO.Directory.Exists(this.OutputDirectory))
{
Debug.WriteLine("----------------------Error: 請核實OutputDirectory是否存在!----------------------");
return;
}
//創建實體層Entity類
this.GenerateEntityClasses();
//this.GenerateBLLClasses(); //----可以根據需要選擇生成
//this.GenerateDALClasses();
Debug.WriteLine("Create Over!");
%>
<script runat="template">
//生成實體Entity類
private void GenerateEntityClasses()
{
Debug.WriteLine("----------------------實體Entity類 生成Start----------------------");
CodeTemplate Template = new EntityTemplate();
foreach(TableSchema table in this.SourceDatabase.Tables)
{
string FileDirectory = this.GetFileDirectory("Model",table.Name,"");
//生成模板---設置屬性
Template.SetProperty("TargetTable",table);
Template.SetProperty("ModelsNamespace",this.MainNamespace+this.ModelNamespace);
//文件輸出
Template.RenderToFile(FileDirectory,true);
Debug.WriteLine(FileDirectory +" 創建成功.");
}
Debug.WriteLine("----------------------實體Entity類 生成End----------------------");
}
//將字符串首字母轉換為大寫
private string MakeCamel(string value)
{
return value.Substring(0, 1).ToUpper() + value.Substring(1);
}
private string GetFileDirectory(string flolderName,string tabName,string surfix)
{
return string.Format("{0}\\{1}\\{2}{3}.cs",OutputDirectory,flolderName,MakeCamel(tabName),surfix);
}
</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>
??????此批量生成模板——生成的 模型層, 批量生成模板 和 實體類模板(DBMad.Models.cst)文件的,目錄位置如下:
——此例中,是并列
??制作的關鍵點:1.BatchCreate.cst中注冊 調用模板——類似于 .net中 注冊自定義控件
?<%-- 注冊實體層Entity模板 --%>
<%@ Register Name="EntityTemplate" Template="DBMad.Models.cst" MergeProperties="Flase" ExcludeProperties=""%>
2. BatchCreate.cst 的生成方法中,調用模板,并設置調用模板的屬性
?CodeTemplate Template = new EntityTemplate();
??????? foreach(TableSchema table in this.SourceDatabase.Tables)
??????? {
???string FileDirectory = this.GetFileDirectory("Model",table.Name,"");
??????????? //生成模板---設置屬性
??????????? Template.SetProperty("TargetTable",table);
???Template.SetProperty("ModelsNamespace",this.MainNamespace+this.ModelNamespace);
??????????? //文件輸出
??????????? Template.RenderToFile(FileDirectory,true);
??????????? Debug.WriteLine(FileDirectory +" 創建成功.");
??????? }
?? ok, 大致方法如上,如有不清楚的朋友,可留言,再詳細說明!
總結
以上是生活随笔為你收集整理的C#CodeSmith代码批量生成模板制作经验分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PPT(五)-让你的图片靓起来!
- 下一篇: c# char unsigned_dll