搭建一套自己實用的.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】

 

 

原文鏈接:http://www.cnblogs.com/hy59005271/p/4762533.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM