工欲善其事必先利其器, 下面来说说代码生成器。
现在代码生成器品种繁多各式各样, 什么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] public class UnitTest1 { public class TestUser { public int ID { get; set; } public string Name { get; set; } } [TestMethod] public void TestMethod1() { string strTest = " 测试 @Model.ID @Model.Name "; TestUser testUser = new TestUser() { ID = 1, Name = "2" }; var result = 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 对象
using HY.CodeBuilder.Model.Code;using HY.CodeBuilder.Model.DataBase;using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Runtime.Caching;using System.Text;namespace HY.CodeBuilder.BuildCode.Core{ public class BuildCodeService { public CodeKeywords Keywords { get; private set; } public CodeOptions CodeModel { get; private set; } private DataTable ColumnDataTable { get; set; } private DataBaseObject DBObject { get; set; } public BuildCodeService(DataBaseObject dbObject, string nameSpace, string tableName, DataTable columnDataTable) { Keywords = new CodeKeywords(); DBObject = dbObject; CodeModel = new CodeOptions(); CodeModel.TableName = tableName; CodeModel.NameSpace = nameSpace; ColumnDataTable = columnDataTable.Copy(); } /// <summary> /// 获得 /// </summary> /// <returns></returns> public List<Column> TableColumns() { string cacheKey = DBObject.DBType + "_" + DBObject.BaseName + "_" + DBObject.ServerIP + CodeModel.TableName; if (Common.Cache.Get(cacheKey) != null) { return (List<Column>)Common.Cache.Get(cacheKey); } List<Column> list = new List<Column>(); foreach (DataRow dr in ColumnDataTable.Rows) { Column colum = new Column(); 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)); return list; } public Column PKColumn() { Column column = new Column(); foreach (Column entity in TableColumns()) { if (entity.IsPK) { column = entity; break; } } return column; } public string GetDataTypeByColumn(Column column) { string VariableType = ""; string isNullStr = ""; 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 = ""; } } return VariableType + isNullStr; } }}
CodeKeywords对象存放关键字,用于支持和模板引擎冲突的字符串, 当然Razor语法很强大,这个类我用不到了。
CodeOptions,代码生成的一些变量。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace HY.CodeBuilder.Model.Code{ public class CodeOptions { public string NameSpace { get; set; } public string TableName { get; set; } public string CreateTime { get { return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } } }}
Column类:字段信息
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace HY.CodeBuilder.Model.Code{ public class Column { /// <summary> /// 字段名称 /// </summary> public string ColumnsName { get; set; } /// <summary> /// 描述 /// </summary> public string Description { get; set; } /// <summary> /// 数据库字段类型 /// </summary> public string DBDataType { get; set; } /// <summary> /// 字段类型 /// </summary> public string DataType { get; set; } /// <summary> /// 默认 /// </summary> public string Default { get; set; } /// <summary> /// 是否为空 /// </summary> public bool IsNullable { get; set; } /// <summary> /// 是否主键 /// </summary> public bool IsPK { get; set; } /// <summary> /// 是否序列 /// </summary> public bool IsIdentity { get; set; } /// <summary> /// 长度 /// </summary> public string ColumnsLength { get; set; } }}
了解了这些你就可以定义自己的模板了。
下载:
相关文章:
搭建一套自己实用的.net架构(2)【日志模块-log4net】
搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】
搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】
- 2楼杨义金
- mark
- 1楼wdwwtzy
- 基于T4的貌似更厉害一点
- Re: 咖啡不苦不舒服
- @wdwwtzy,能介绍下T4有哪些强大的功能啊? 还没用过T4