工欲善其事必先利其器, 下面来说说代码生成器。现在代码生成器品种繁多各式各样, 什么codesmith、T4、 动软也算。那么每款代码生成器都有自己模板解析引擎。
现在比较流行的NVelocity(之前我用这个,不过在实际过程中遇到了很多关键字冲突的问题。不单单是$), 最后只好改成了RazorEngine。
Razorengine源码: http://razorengine.codeplex.com/
如果你在mvc项目中,原项目和mvc的Antlr3.Runtime.dll版本有冲突,可以在这里下载
RazorEngineNET4.0: https://github.com/sanxia/RazorEngineNET4.0
这里我用的是NET 4.0版本, 编译后获得到RazorEngine.NET4.0.dll System.Web.Razor.Net4.0.dll
语法:你应该会mvc的razor语法吧。
这里简单介绍下使用方式,应该也够用了,高级用法自己去研究吧。
下面是一个简单的单元测试:
[TestClass]publicclassUnitTest1
{publicclassTestUser
{publicintID {get;set; }publicstringName {get;set; }
}
[TestMethod]publicvoidTestMethod1()
{stringstrTest ="测试 @Model.ID @Model.Name";
TestUser testUser=newTestUser()
{
ID=1,
Name="2"};varresult = RazorEngine.Razor.Parse<TestUser>(strTest, testUser);
}
}
变量strTest中的@Model 就是代码传递进的 TestUser 对象。 现在你应该知道怎么使用了。
先说说HY.CodeBuilder的实现方式:
HY.CodeBuilder使用.net4.0版本C#编写,实现了数据字典的功能和 代码生成的功能,毕竟是自己写着玩的东西,怎么能和别人的产品比较那,
能做出来就不错了。这里借鉴了本山老师的名言:要什么自行车啊?
下面截几个图先让大家看下。
主要功能:
1、查看数据库字段等信息
2、可以修改表和字段的备注描述
3、导出Excel
4、代码生成
代码生成器可以在结尾下载。 大致就这么几个文件了。目前只支持 MsSql,Oracle、MySQL。(mysql修改字段备注未实现,这里要说:坑爹啊)
HY.CodeBuilder.exe.config 可以修改默认的命名空间和模板文件夹(默认是Templates)
Templates中的模板是我这边定义的一些,你可以修改和扩展,都是Razor语法,你懂的。
下面就模板中的@Model 说明一下。
@Model传递的是 一个BuildCodeService 对象
usingHY.CodeBuilder.Model.Code;usingHY.CodeBuilder.Model.DataBase;usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.Linq;usingSystem.Runtime.Caching;usingSystem.Text;namespaceHY.CodeBuilder.BuildCode.Core
{publicclassBuildCodeService
{publicCodeKeyWords Keywords {get;PRivateset; }publicCodeOptions CodeModel {get;privateset; }privateDataTable ColumnDataTable {get;set; }privateDataBaSEObject DBObject {get;set; }publicBuildCodeService(DataBaseObject dbObject,stringnameSpace,stringtableName, DataTable columnDataTable)
{
Keywords=newCodeKeywords();
DBObject=dbObject;
CodeModel=newCodeOptions();
CodeModel.TableName=tableName;
CodeModel.NameSpace=nameSpace;
ColumnDataTable=columnDataTable.Copy();
}///<summary>///获得///</summary>///<returns></returns>publicList<Column>TableColumns()
{stringcacheKey = DBObject.DBType +"_"+ DBObject.BaseName +"_"+ DBObject.Serverip+CodeModel.TableName;if(Common.Cache.Get(cacheKey) !=null)
{return(List<Column>)Common.Cache.Get(cacheKey);
}
List<Column> list =newList<Column>();foreach(DataRow drinColumnDataTable.Rows)
{
Column colum=newColumn();
colum.ColumnsName= dr["ColumnsName"].ToString().Trim();
colum.Description= dr["description"].ToString().Trim().Replace("\r\n","");if(string.IsNullOrEmpty(colum.Description))
{
colum.Description=colum.ColumnsName;
}
colum.DBDataType= dr["DateType"].ToString().Trim().ToLower();
colum.Default= dr["默认值"].ToString().Trim();
colum.IsNullable= (dr["允许空"].ToString().Trim() =="√"?true:false);
colum.ColumnsLength= dr["占用字节数"].ToString().Trim();
colum.IsPK= (dr["主键"].ToString().Trim() =="√"?true:false);
colum.IsIdentity= (dr["标识"].ToString().Trim() =="√"?true:false);
colum.DataType=GetDataTypeByColumn(colum);
list.Add(colum);
}
Common.Cache.Insert(cacheKey, list, DateTime.Now.AddMinutes(5));returnlist;
}publicColumn PKColumn()
{
Column column=newColumn();foreach(Column entityinTableColumns())
{if(entity.IsPK)
{
column=entity;
break;
}
}returncolumn;
}publicstringGetDataTypeByColumn(Column column)
{stringVariableType ="";stringisNullStr ="";switch(column.DBDataType.ToLower())
{case"int":
VariableType="int";
break;case"tinyint":
VariableType="int";
break;case"bigint":
VariableType="Int64";
break;case"decimal":
VariableType="decimal";
break;case"number":
VariableType="decimal";
break;case"clob":
VariableType="string";
break;case"char":
VariableType="string";
break;case"nchar":
VariableType="string";
break;case"nvarchar":
VariableType="string";
break;case"varchar2":
VariableType="string";
break;case"nvarchar2":
VariableType="string";
break;case"varchar":
VariableType="string";
break;case"text":
VariableType="string";
break;case"smalldatetime":
VariableType="DateTime";
break;case"datetime":
VariableType="DateTime";
break;case"date":
VariableType="DateTime";
break;case"uniqueidentifier":
VariableType="Guid";
break;case"bit":
VariableType="bool";
break;case"image":
VariableType="byte[]";
break;default:
VariableType="【"+ column +"】没识别,自己改吧";
break;
}if(column.IsNullable)
{
isNullStr="?";if(VariableType =="byte[]"|| VariableType =="string")
{
isNullStr="";
}
}returnVariableType +isNullStr;
}
}
}
CodeKeywords对象存放关键字,用于支持和模板引擎冲突的字符串, 当然Razor语法很强大,这个类我用不到了。
CodeOptions,代码生成的一些变量。
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceHY.CodeBuilder.Model.Code
{publicclassCodeOptions
{publicstringNameSpace {get;set; }publicstringTableName {get;set; }publicstringCreateTime {get{returnDateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } }
}
}
Column类:字段信息
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceHY.CodeBuilder.Model.Code
{publicclassColumn
{///<summary>///字段名称///</summary>publicstringColumnsName {get;set; }///<summary>///描述///</summary>publicstringDescription {get;set; }///<summary>///数据库字段类型///</summary>publicstringDBDataType {get;set; }///<summary>///字段类型///</summary>publicstringDataType {get;set; }///<summary>///默认///</summary>publicstringDefault {get;set; }///<summary>///是否为空///</summary>publicboolIsNullable {get;set; }///<summary>///是否主键///</summary>publicboolIsPK {get;set; }///<summary>///是否序列///</summary>publicboolIsIdentity {get;set; }///<summary>///长度///</summary>publicstringColumnsLength {get;set; }
}
}
了解了这些你就可以定义自己的模板了。
下载:
HY.CodeBuilder.rar
相关文章:
搭建一套自己实用的.net架构(1)【概述】
搭建一套自己实用的.net架构(2)【日志模块-log4net】
搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】
搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】
原文链接:http://www.cnblogs.com/hy59005271/p/4762533.html