很多時候項目必須是三層架構模式,但是很多繁瑣的代碼讓多數程序員鬧心……那有沒有一個省時省力的工具快速的幫我們搞定三層架構呢?回答是肯定的,很早之前技術牛人李天平就開發出了這么一款工具,目前該工具還在不斷的更新,更多的功能也出現了。實在是讓那些老鳥們省了不少力氣。
廢話不多時,看教程。
一. 功能介紹
動軟代碼生成器 是一款為程序員設計的全功能自動代碼生成器,也是一個智能化軟件開發平臺,它可以生成基于面向對象的思想和三層架構設計的代碼,結合了軟件開發中經典的思想和設計模式,融入了工廠模式,反射機制等等一些思想。主要實現在對應數據庫中表的基類代碼的自動生成,包括生成屬性、添加、修改、刪除、查詢、存在性、Model類構造等基礎代碼片斷,支持不同架構代碼生成,使程序員可以節省大量機械錄入的時間和重復勞動,而將精力集中于核心業務邏輯的開發。新版本中除了程序集組件模板,也同樣支持用戶自定義文本模板,像寫ASPX代碼一樣寫模板,一鍵代碼生成,更方便,更靈活。
動軟讓軟件開發變得輕松而快樂!讓企業不斷提升開發效率,同樣的時間創造出更大的價值。
二. 下載安裝
1. 系統要求: Microsoft Windows2000/XP/2003/7 或者更高。機器必須安裝.NET Framework v2.0。
2. 官方下載地址:
http://www.maticsoft.com/download.aspx
3. 下載解壓后安裝包有如下文件:
Codematic2.msi 是動軟.NET代碼生成器的安裝文件。
Builder文件夾是代碼生成插件的源碼,動軟.NET代碼生成器支持可擴展的代碼生成插件,用戶可以定制自己的代碼生成的插件,根據接口開發自己的代碼生成方式,按自己的需求進行代碼生成。
Codematic_Data.MDF和Codematic_Log.LDF 是通過動軟新建項目中所帶管理模塊所需要的數據庫文件。后臺管理員默認登錄用戶名:admin 密碼:1
4. 雙擊Codematic2.msi 進行直接安裝即可。
安裝動軟時,如果用戶機器360彈出警告,那僅僅是個簽名認證提示,并非木馬,選擇“繼續安裝”,然后點擊“確定”即可。
動軟鄭重聲明: 動軟.NET代碼生成器,絕無插件木馬,純綠色軟件。請放心安裝。
5. 安裝成功后,在開始-菜單和桌面上會有動軟.NET代碼生成器的圖標。
三. 模板代碼生成
1. 在左側【數據庫視圖】,選中表,右鍵菜單【模板代碼生成】
2. 然后,出現單表的代碼生成器界面,我們設置自己需要更改的信息
備注:代碼還有一些生成規則,是在菜單【工具】-【選項】-【代碼生成設置】中進行設置。
3. 然后,點擊工具欄【生成代碼】或者【生成代碼】按鈕,即可生成該類的代碼。生成的代碼,可以直接復制到項目文件中,也可以右鍵保存成CS文件。通過窗體下面的Tab按鈕可以來回切換設計視圖和代碼。
4. 設置模板目錄
5. 模板保存
四. 模板代碼批量生成
1. 選中數據庫或者表,然后單擊右鍵菜單【模板代碼批量生成】
2. 出現的窗口和新建項目基本相似,只是多了一個選中架構的選項:
3. 選則要生成的表,然后點擊【導出】。
4. 在生成的文件夾中,我們可以看到:
批量生成代碼只生成業務表的代碼,不再有解決方案文件和項目文件,以及其它類庫等。我們可以將生成的這些文件直接拖到現有的解決方案中即可
五. 代碼生成規則設置
打開菜單【工具】-【選項】-【代碼生成設置】
這些配置保存后,在生成代碼的時候將按照這個規則進行生成。
代碼生成的規則設置范圍還在不斷增加中。
另外,不同數據庫類型的數據類型各有不同,這里提供了字段類型和C#中的類型建立映射關系,生成代碼時將按映射關系來生成代碼字段屬性的類型。
六. 模板編寫教程
模板的大體分為5塊內容:模板指令聲明,代碼語句塊,表達式塊,類功能控制塊,文本塊輸出。下面我們分別來介紹一下這5塊內容的語法和使用說明。
1. 模板指令聲明塊 <#@ #>
和ASP.NET頁面的指令一樣,它們出現在文件頭,通過<#@?#>表示。其中<#@ template ?#>指令是必須的,用于定義模板的基本屬性。
(1) 模板指令
<#@ template [language="VB"] [hostspecific="true"] [debug="true"] [inherits="templateBaseClass"] [culture="code"] [compilerOptions="options"] #>
例如 <#@ template language="C#v3.5" hostSpecific="true" debug="true" #>
Language 這里可以指定模板使用的語言。
hostSpecific="true" 表示是否使用特定的host,host里面包含了模板使用的各種對象。
注意:
所有屬性值必須用雙引號都括起來。如果值本身包含引號,則必須使用 \ 字符對這些引號進行轉義。 指令通常是模板文件或包含的文件中的第一個元素。
(2) 參數指令 <#@ parameter type="Full.TypeName" name="ParameterName" #>
(3) 輸出指令 <#@ output extension=".fileNameExtension" encoding="encoding" #>
output extension=".cs" 指定生成文件的擴展名。
encoding="encoding" 指定生成文件的編碼。
(4) 程序集指令 <#@ assembly name="System.Data" #>
用于添加程序集引用,如果要使用第三方程序集,那么最好在項目中添加引用。
注:您應使用絕對路徑的名稱,或者路徑名稱中使用標準的宏的名稱。
例如: <#@ assembly name="$(SolutionDir)library\MyAssembly.dll" #>
(5) 導入指令 <#@ import namespace="System.Data" #>
導入要使用的命名空間,注意:這里的命名空間必須要在前面指定的程序集里面找得到的,比如我指定命名空間"System.Data","System.Data.Common",這些在程序集System.Data中都有的
(6) 包含指令 <#@ include file="test.tt" #> 導入模板,類似Html的include用法
include 指令插入其他模板文件的文本。
例如,下面的指令插入 test.txt 的內容。 <#@ include file="c:\test.txt" #>
在處理時,被包含內容就像是包含文本模板的組成部分一樣。 不過,即使 include 指令后跟普通文本塊和標準控制塊,也可以包含編寫有類功能塊 <#+...#> 的文件
2. 代碼語句塊: <# #>
在模板文件中,可以混合使用任意數量的文本塊和標準控制塊。中間是一段通過相應編程語言編寫的程序調用,我們可以通過代碼語句快控制文本轉化的流程。
注意:不能在控制塊中嵌套控制塊。
<#@ output extension=".txt" #>
<#
for(int i = 0; i < 4; i++)
{
#>
Hello!
<#
}
#>
3. 表達式塊:<#= #>
表達式控制塊計算表達式并將其轉換為字符串。 該字符串將插入到輸出文件中。
例如: <#= 2 + 3 #>
表達式可以包含作用域中的任何變量。 例如,下面的塊輸出數字行:
<#@ output extension=".txt" #>
<#
for(int i = 0; i < 4; i++)
{
#>
This is hello number <#= i+1 #>: Hello!
<#
}
#>
4. 類功能控制塊:<#+ #>
如果文本轉化需要一些比較復雜的邏輯,我們需要寫在一個單獨的輔助方法中,甚至是定義一些單獨的類,我們就是將它們定義在類特性塊中。類功能控制塊定義屬性、方法或不應包含在主轉換中的所有其他代碼。 類功能塊常用于編寫幫助器函數。 通常,類功能塊位于單獨的文件中,這樣它們可以包含在多個文本模板中。 類功能控制塊以 <#+ ... #> 符號分隔。
例如,下面的模板文件聲明并使用一個方法:
<#@ output extension=".txt" #>
Squares:
<#
for(int i = 0; i < 4; i++)
{
#>
The square of <#= i #> is <#= Square(i+1) #>.
<# #>
That is the end of the list.
<#+ // Start of class feature block
private int Square(int i)
{
return i*i;
}
#>
類功能必須編寫在文件末尾。不過,即使 include指令后跟標準塊和文本,也可以 <
#@include
#> 包含類功能的文件。例如下面代碼則會報錯:
List of Squares:
<#
for(int i = 0; i < 4; i++)
{ WriteSquareLine(i); }
#>
End of list.
<#+ // Class feature block
private void WriteSquareLine(int i)
{
#>
The square of <#= i #> is <#= i*i #>.
<#
}
#>
5. 文本塊輸出
可以使用 Write() 和 WriteLine() 方法在標準代碼塊內追加文本,而不必使用表達式代碼塊。 它們可幫助縮進輸出和報告錯誤。
下面兩個代碼塊在功能上是等效的。
包含表達式塊的代碼塊
<#
int i = 10;
while (i-- > 0)
{ #>
<#= i #>
<# }
#>
使用 WriteLine() 的代碼塊
<#
int i = 10;
while (i-- > 0)
{
WriteLine((i.ToString()));
}
#>
Write() 和 WriteLine() 方法有兩個重載,其中一個重載接受單個字符串參數,另一個重載接受一個復合格式字符串以及將包含在字符串中的對象數組(與 Console.WriteLine() 方法類似)。
下面兩種 WriteLine() 用法在功能上是等效的:
<#
string msg = "Say: {0}, {1}, {2}";
string s1 = "hello";
string s2 = "goodbye";
string s3 = "farewell";
WriteLine(msg, s1, s2, s3);
WriteLine("Say: hello, goodbye, farewell");
#>
設置文本模板輸出縮進的格式。
CurrentIndent 字符串屬性顯示文本模板中的當前縮進,該類還具有一個 indentLengths 字段,該字段是已添加的縮進的列表。
PushIndent() 方法增加縮進,
PopIndent() 方法減少縮進。
ClearIndent() 方法,刪除所有縮進。
下面的代碼塊演示這些方法的用法:
<#
WriteLine(CurrentIndent + "Hello");
PushIndent(" ");
WriteLine(CurrentIndent + "Hello");
PushIndent(" ");
WriteLine(CurrentIndent + "Hello");
ClearIndent();
WriteLine(CurrentIndent + "Hello");
PushIndent(" ");
WriteLine(CurrentIndent + "Hello");
#>
此代碼塊產生以下輸出:
Hello
Hello
Hello
Hello
Hello
可以使用錯誤和警告實用工具方法向 Visual Studio 錯誤列表添加消息。 例如,下面的代碼向錯誤列表添加一條錯誤消息。
<#
try
{
string str = null;
Write(str.Length.ToString());
}
catch (Exception e)
{
Error(e.Message);
}
#>
7. 模板示例講解
8. Host對象屬性列表
Host提供了一下屬性和方法,方便編寫模板時調用。 TableHost屬性 類型 說明 DbName string 當前數據庫名。
DbType
string
當前數據庫類型:SQL2000,SQL2005,SQL2008,Oracle,OleDb,MySQL,SQLite TableList List<TableInfo> 當前數據庫所有的表集合,返回List<TableInfo>
ViewList
List<TableInfo>
當前數據庫所有的視圖集合,返回List<TableInfo> ProcedureList List<TableInfo> 當前數據庫所有的存儲過程集合,返回List<TableInfo>
DbHelperName
string
數據庫訪問類名,例如:DbHelperSQL ProjectName string 項目名稱
ProcPrefix
string
存儲過程前綴,例如sp_ ModelPrefix string Model類名前綴
ModelSuffix
string
Model類名后綴 BLLPrefix string BLL類名前綴
BLLSuffix
string
BLL類名后綴 DALPrefix string DAL類名前綴
DALSuffix
string
DAL類名后綴 TabNameRule string 類命名規則: same(保持原樣) lower(全部小寫) upper(全部大寫) 工具-選項-代碼生成設置中進行設置。
DbParaDbType
string
得到數據庫字段DbType的類名。例如:SqlDbType preParameter string 當前數據庫類型對應的存儲過程參數符號,例如:@
Folder
string
所屬文件夾 TableName string 表名
TableDescription
string
表的描述信息 Fieldlist List<ColumnInfo> 字段集合
Keys
List<ColumnInfo>
主鍵字段集合 IdentityKey ColumnInfo 自動增長標識列;如果沒有則返回null。
9. Host對象方法列表
TableHost方法 說明 string GetModelClass(string TabName) 組合得到Model類名: 前綴+類名+后綴
string GetBLLClass(string TabName)
組合得到BLL類名: 前綴+類名+后綴 string GetDALClass(string TabName) 組合得到DAL類名: 前綴+類名+后綴
10. TableInfo 表對象屬性
屬性 類型 說明 TabName string 表名稱
TabUser
string
用戶對象 TabType string 表類型
TabDate
string
創建日期
11. ProcedureHost 表對象屬性
屬性 類型 說明 ProcedureName string 表名稱
Parameterlist
List<ColumnInfo>
參數列表 OutParameter ColumnInfo 輸出參數字段信息
12. ColumnInfo 字段信息對象
屬性 類型 說明 ColumnOrder string 序號
ColumnName
string
字段名 TypeName string 字段類型
Length
string
長度 Precision string 精度
Scale
string
小數位數 IsIdentity bool 是否是標識列
IsPrimaryKey
bool
是否是主鍵 Nullable bool 是否允許空
DefaultVal
string
默認值 Description string 備注
13. CodeCommon工具類常用方法 CodeCommon方法 說明
string DbTypeToCS(string dbtype) 得到“數據庫字段類型”對應的“c#類型”
bool isValueType(string cstype)
是否C#中的值(可空)類型 string DbTypeLength(string dbtype,string datatype, string Length) 得到數據庫字段DbType的類型和長度
ColumnInfo GetIdentityKey(List<ColumnInfo> keys)
得到自動增長標識列字段 string DbParaDbType(string DbType) 得到不同數據庫DbType類名,例如SqlDbType
string preParameter(string DbType)
得到不同數據庫的存儲過程參數符號,例如:@ string GetWhereParameterExpression(List<ColumnInfo> keys, bool IdentityisPrior, string DbType) 得到Where條件語句 - Parameter方式 (例如:用于Exists Delete GetModel 的where) 例如:where
NewsId=@NewsId
string GetPreParameter(List<ColumnInfo> keys, bool IdentityisPrior, string DbType)
生成sql語句中的參數列表(例如:用于 Exists Delete GetModel 的where參數賦值) string GetInParameter(List<ColumnInfo> keys, bool IdentityisPrior) 得到方法輸入參數定義的列表 (例如:用于Exists Delete GetModel 的參數傳入)
string GetFieldstrlist(List<ColumnInfo> keys, bool IdentityisPrior)
字段的 select 列表,和方法傳遞的參數值 string GetWhereExpression(List<ColumnInfo> keys, bool IdentityisPrior) 得到Where條件語句 - SQL方式 (例如:用于Exists Delete GetModel 的where)
string GetModelWhereExpression(List<ColumnInfo> keys, bool IdentityisPrior)
得到Where條件語句 - SQL方式 (例如:用于Exists Delete GetModel 的where) string CutDescText( string descText,int cutLen,string ReplaceText) 字符串描述截取:要截取的字符串,長度,替代字符串。
輸出效果模板代碼:(復制到模板代碼生成器中執行即可看到效果)
<#@ template language="c#" HostSpecific="True" #>
<#@ output extension= ".cs" #>
<#
TableHost host = (TableHost)(Host);
ColumnInfo identityKey=host.IdentityKey;
#>
數據庫名:<#= host.DbName #>
數據庫類型:<#= host.DbType #>
表名:<#= host.TableName #>
表描述:<#= host.TableDescription #>
數據庫訪問類名:<#= host.DbHelperName #>
項目名稱:<#= host.ProjectName #>
存儲過程前綴:<#= host.ProcPrefix #>
類命名規則:<#= host.TabNameRule #>
數據庫DbType類名:<#= host.DbParaDbType #>
存儲過程參數符號:<#= host.preParameter #>
表集合:
<# foreach (TableInfo tab in host.TableList)
{
WriteLine(tab.TabName);
} #>
字段集合:
<# foreach (ColumnInfo c in host.Fieldlist)
{
WriteLine("public {0} {1} {{ get; set; }}",CodeCommon.DbTypeToCS(c.TypeName),c.ColumnName );
} #>
字段集合增加連接符號:
<# for(int i=0;i< host.Keys.Count;i++)
{ ColumnInfo key = host.Keys[i]; #>
<# if (key.IsPrimaryKey || !key.IsIdentity)
{#>
strSql.Append(" <#= key.ColumnName#> = <#=preParameter#><#=key.ColumnName#> <# if (i< host.Keys.Count-1 ) {#>and <#}#> ");
<#}#>
<# }#>
主鍵字段集合集合:
<# foreach (ColumnInfo c in host.Keys)
{
WriteLine("public {0} {1} {{ get; set; }}",CodeCommon.DbTypeToCS(c.TypeName),c.ColumnName );
} #>
Model類名:<#= host.GetModelClass(host.TableName) #>
BLL類名:<#= host.GetBLLClass(host.TableName) #>
DAL類名:<#= host.GetDALClass(host.TableName) #>
<#= CodeCommon.DbParaDbType(host.DbType) #>
<#= CodeCommon.preParameter(host.DbType) #>
<#= CodeCommon.GetWhereParameterExpression(host.Keys,true,host.DbType) #>
<#= CodeCommon.GetPreParameter(host.Keys,true,host.DbType) #>
<#= CodeCommon.GetInParameter(host.Keys,true) #>
<#= CodeCommon.GetFieldstrlist(host.Keys,true) #>
<#= CodeCommon.GetWhereExpression(host.Keys,true) #>
其他詳細教程見開發者李天平博客: http://www.cnblogs.com/ltp/archive/2011/05/25/2057151.html
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
