当前位置: 代码迷 >> .NET相关 >> 筹建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】
  详细解决方案

筹建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】

热度:140   发布时间:2016-04-24 02:46:01.0
搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】

工欲善其事必先利其器,  下面来说说代码生成器。

现在代码生成器品种繁多各式各样, 什么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; }    }}

 

 

了解了这些你就可以定义自己的模板了。 

 

下载:

HY.CodeBuilder.rar

 

 

相关文章:

搭建一套自己实用的.net架构(1)【概述】

搭建一套自己实用的.net架构(2)【日志模块-log4net】

搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】

搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】

 

2楼杨义金
mark
1楼wdwwtzy
基于T4的貌似更厉害一点
Re: 咖啡不苦不舒服
@wdwwtzy,能介绍下T4有哪些强大的功能啊? 还没用过T4