C#CodeSmith代码批量生成模板制作经验分享
?????? 最近忙的有些一頭霧水,原本定的計(jì)劃:每周寫(xiě)一篇技術(shù)文章,也被整的‘?dāng)R淺’了。今天感覺(jué)怎么著也得寫(xiě)一篇,要不這個(gè)計(jì)劃可能又很難堅(jiān)持下去了(ps: 寫(xiě)東西,不僅要時(shí)間,更重要的是心情——能靜下心去寫(xiě))。直接說(shuō)正題,——代碼生成器,應(yīng)該是每個(gè)程序員必備的工具,無(wú)論你是做什么開(kāi)發(fā) 或 使用的那種編程語(yǔ)言,它都能在很大程度上為你節(jié)省不少時(shí)間;而做C#開(kāi)發(fā)的,可選的代碼生成器,可能要更多 ——用的比較多、好用的 有: CodeSmith,動(dòng)軟代碼生成器...。在這里,先簡(jiǎn)要的說(shuō)下 我對(duì)這兩種工具的使用感受:a. CodeSmith是我常用的,比較好用 ,可以很好的支持mysql,mssql,access等數(shù)據(jù)庫(kù)的三層代碼類(lèi) 和數(shù)據(jù)庫(kù)表的相關(guān)存儲(chǔ)過(guò)程等,其模板(制作)語(yǔ)言比較簡(jiǎn)單易用,缺點(diǎn):目前網(wǎng)上可用的 和其默認(rèn)的模板,都不支持批量生成代碼類(lèi),即每次只能生成一個(gè)表的對(duì)應(yīng)模板類(lèi)。b.動(dòng)軟代碼生成器, 跟CodeSmith比,其優(yōu)點(diǎn)在于:開(kāi)源免費(fèi),可以批量生成,缺點(diǎn)(僅針對(duì)于我下載使用的,或者說(shuō)是我個(gè)人的看法):對(duì)access數(shù)據(jù)庫(kù)的支持不好(無(wú)法生成),其它的它們到底哪個(gè)更功能強(qiáng)大或好用,這里就不再討論和深究。
????? 之前,在做配餐系統(tǒng)開(kāi)發(fā)時(shí),因一開(kāi)始數(shù)據(jù)庫(kù)中的表不多,就10個(gè)左右,用CodeSmith一個(gè)個(gè)去生成相關(guān)類(lèi),雖感覺(jué)有些麻煩,但也沒(méi)想著找個(gè)能一次性搞定的方法,就有些‘麻木’的用著。而最近,需要在已做好的配餐系統(tǒng)中增加一個(gè)新的模塊 ——此模塊差不多要新建6個(gè)左右的數(shù)據(jù)庫(kù)表。表增加了,那些可以用CodeSmith生成的類(lèi),自然需要一個(gè)個(gè)去生成,再加上數(shù)據(jù)庫(kù)表并不是一下就能定好的,增改字段都是很正常的事,這樣,就突然感覺(jué),如果在do like this(如此操作),會(huì)浪費(fèi)不少時(shí)間,也麻煩,于是,想偷懶,省事 ——(ps:呵呵...,不得不說(shuō)很多工具正是因?yàn)槿藗兿胪祽惺∈露鴦?chuàng)造出來(lái)。)就自然而然需要想辦法實(shí)現(xiàn)‘代碼批量’生成。 先上網(wǎng)找找看,一搜“CodeSmith代碼批量生成模板”,卻基本上沒(méi)有此類(lèi)信息,還好看到一個(gè)網(wǎng)友寫(xiě)的一篇“CodeSmith代碼批量生成模板”測(cè)試類(lèi)的文章,看后,有些收獲,按其方法 將自己的模板修改后,批量生成模板搞定。現(xiàn)將模板 和 制作方法 貼出,希望對(duì)需要的朋友有些幫助!
??? 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"%>
<%-- 注冊(cè)模板類(lèi)start --%>
<%-- 注冊(cè)實(shí)體層Entity模板 --%>
<%@ Register Name="EntityTemplate" Template="DBMad.Models.cst" MergeProperties="Flase" ExcludeProperties=""%>
<%-- 注冊(cè)業(yè)務(wù)邏輯層Business模板 --%>
<%@ Register Name="BusinessTemplate" Template="DBMad.BLL.cst" MergeProperties="Flase" ExcludeProperties=""%>
<%-- 注冊(cè)模板類(lèi)end --%>
<%-- 模板屬性start --%>
<%-- 數(shù)據(jù)庫(kù) --%>
<%@ 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: 請(qǐng)核實(shí)OutputDirectory是否存在!----------------------");
return;
}
//創(chuàng)建實(shí)體層Entity類(lèi)
this.GenerateEntityClasses();
//this.GenerateBLLClasses(); //----可以根據(jù)需要選擇生成
//this.GenerateDALClasses();
Debug.WriteLine("Create Over!");
%>
<script runat="template">
//生成實(shí)體Entity類(lèi)
private void GenerateEntityClasses()
{
Debug.WriteLine("----------------------實(shí)體Entity類(lèi) 生成Start----------------------");
CodeTemplate Template = new EntityTemplate();
foreach(TableSchema table in this.SourceDatabase.Tables)
{
string FileDirectory = this.GetFileDirectory("Model",table.Name,"");
//生成模板---設(shè)置屬性
Template.SetProperty("TargetTable",table);
Template.SetProperty("ModelsNamespace",this.MainNamespace+this.ModelNamespace);
//文件輸出
Template.RenderToFile(FileDirectory,true);
Debug.WriteLine(FileDirectory +" 創(chuàng)建成功.");
}
Debug.WriteLine("----------------------實(shí)體Entity類(lèi) 生成End----------------------");
}
//將字符串首字母轉(zhuǎn)換為大寫(xiě)
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>
??????此批量生成模板——生成的 模型層, 批量生成模板 和 實(shí)體類(lèi)模板(DBMad.Models.cst)文件的,目錄位置如下:
——此例中,是并列
??制作的關(guān)鍵點(diǎn):1.BatchCreate.cst中注冊(cè) 調(diào)用模板——類(lèi)似于 .net中 注冊(cè)自定義控件
?<%-- 注冊(cè)實(shí)體層Entity模板 --%>
<%@ Register Name="EntityTemplate" Template="DBMad.Models.cst" MergeProperties="Flase" ExcludeProperties=""%>
2. BatchCreate.cst 的生成方法中,調(diào)用模板,并設(shè)置調(diào)用模板的屬性
?CodeTemplate Template = new EntityTemplate();
??????? foreach(TableSchema table in this.SourceDatabase.Tables)
??????? {
???string FileDirectory = this.GetFileDirectory("Model",table.Name,"");
??????????? //生成模板---設(shè)置屬性
??????????? Template.SetProperty("TargetTable",table);
???Template.SetProperty("ModelsNamespace",this.MainNamespace+this.ModelNamespace);
??????????? //文件輸出
??????????? Template.RenderToFile(FileDirectory,true);
??????????? Debug.WriteLine(FileDirectory +" 創(chuàng)建成功.");
??????? }
?? ok, 大致方法如上,如有不清楚的朋友,可留言,再詳細(xì)說(shuō)明!
總結(jié)
以上是生活随笔為你收集整理的C#CodeSmith代码批量生成模板制作经验分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PPT(五)-让你的图片靓起来!
- 下一篇: 斐波那契数的实现