工欲善其事必先利其器, 下面來說說代碼生成器。
現在代碼生成器品種繁多各式各樣, 什么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】
原文鏈接:http://www.cnblogs.com/hy59005271/p/4762533.html