动软代码⽣成器教程——懒⼈有福了
很多时候项⽬必须是三层架构模式,但是很多繁琐的代码让多数程序员闹⼼……那有没有⼀个省时省⼒的⼯具快速的帮我们搞定三层架构呢?回答是肯定的,很早之前技术⽜⼈李天平就开发出了这么⼀款⼯具,⽬前该⼯具还在不断的更新,更多的功能也出现了。实在是让那些⽼鸟们省了不少⼒⽓。
废话不多时,看教程。
三.模板代码⽣成
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="" #> 导⼊模板,类似Html的include⽤法
include 指令插⼊其他模板⽂件的⽂本。
例如,下⾯的指令插⼊ 的内容。 <#@ include file="c:\" #>
在处理时,被包含内容就像是包含⽂本模板的组成部分⼀样。不过,即使 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指令后跟标准块和⽂本,也可以 < #> 包含类功能的⽂件。例如下⾯代码则会报错:
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 字段信息对象writeline方法的作用
属性类型说明 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
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( str
ing 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) #>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论