.Net Core3.1 使用 RazorEngine.NetCore 制作实体生成器 (MVC网页版)

目录

前言

一、RazorEngine.NetCore  基本使用

1.安装 Nuget 包 

2.官方示例

二、核心思路

1.基本配置

2.模板的读取

3.数据库相关信息的获取

4.生成实体文件主要方法

5.模板文件的辅助方法

6.模板文件

三、效果展示

总结


前言

我们将实现一个具有基本功能的实体类生成器

基本目标:可自定义模板、可配置数据库链接、可配置模板

开发环境:mysql5.7.31、vs2019 、.net core3.1  Dapper  MVC项目

项目源码在文章最后


一、RazorEngine.NetCore  基本使用

1.安装 Nuget 包 

RazorEngine.NetCore 3.1.0

2.官方示例

using RazorEngine;
using RazorEngine.Templating; // For extension methods.

string template = "Hello @Model.Name, welcome to RazorEngine!";
var result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });

官方项目地址:https://github.com/fouadmess/RazorEngine

通过上面的示例可以看出,通过简单的两句代码就可以将模板和匿名实体结合起来,生成我们想要的文本

下面我将在此基础上逐步完善它。


二、核心思路

1.基本配置

模板的选择与数据库链接的选择需要做成配置:appsettings.json

  "DbConfigInfo": {
    "TemplateName": "modelTest.cshtml", //当前使用的模板文件名称
    "ConnList": [  //数据库链接配置,InUse 表示当前使用的链接
      {
        "ConnStr": "Database=xlcloud;Data Source=172.172.3.50;Port=3306;User Id=user;Password=123456;Charset=utf8;",
        "InUse": true
      },
      {
        "ConnStr": "Database=jscloud;Data Source=172.172.3.56;Port=3306;User Id=user;Password=pwd;Charset=utf8;",
        "InUse": false
      }
    ]
  }

2.模板的读取

模板应当从本地文件中读取,且在程序启动时就应当进行编译,因为模板的编译会消耗较长的时间(可能几秒钟)

            //注册模板中间件
            app.Use(async (context, next) =>
            {
                var templateName = Configuration.GetSection("DbConfigInfo")["TemplateName"];
                var filePath = Path.Combine(env.WebRootPath, "templates", templateName);

                if (!File.Exists(filePath))
                {
                    await context.Response.WriteAsync("模板文件不存在");
                }
                else {

                    //打开并且读取模板
                    string template = File.ReadAllText(filePath);
                    //添加模板
                    Engine.Razor.AddTemplate("templateKey", template);
                    //编译模板
                    Engine.Razor.Compile("templateKey", null);

                    await next.Invoke();
                }
               
            });

这里我建立的是 .net core MVC 项目,在 Stratup.cs  的  Configure 中 加入了一个注册模板的中间件

值得注意的是: Engine.Razor.AddTemplate("templateKey", template);   这一句中的 templateKey 给模板设置了一个唯一标识    之后我们可以通过这个key 直接获取缓存的模板,而不用再次编译。

 

3.数据库相关信息的获取

这里我使用的是MySql 数据库,不同的数据库可以自行修改或扩展,以下是数据库相关的核心方法:

//获取数据库列表

        /// <summary>
        /// 获取数据库列表
        /// </summary>
        /// <returns></returns>
        public static List<string> GetDbs()
        {
            string showdbSql = "SHOW DATABASES;";

            List<string> dbNames;

            using (var dbconn = DbHelper.GetConn())
            {
                dbNames = dbconn.Query<string>(showdbSql).ToList();
            }
            return dbNames;
        }

 

//获取数据库下的数据表

        /// <summary>
        /// 获取数据库下的数据表
        /// </summary>
        /// <param name="dbName"></param>
        /// <returns></returns>
        public static List<string> GetTables(string dbName)
        {
            List<string> tableNames;

            string sql = $@"select table_name from information_schema.tables where table_schema='{dbName}'";

            using (var dbconn = new MySqlConnection(DbHelper.ConnInUse))
            {
                tableNames = dbconn.Query<string>(sql).ToList();
            }

            return tableNames;
        }

//获取数据表中的字段

 /// <summary>
        /// 获取表参数详情
        /// </summary>
        /// <param name="dbName"></param>
        /// <param name="tableName"></param>
        /// <returns></returns>
        private static TableInfo GetParameterInfos(string dbName, string tableName)
        {
            TableInfo tableInfo = new TableInfo(tableName);
            tableInfo.Parameters = new List<DbParamInfo>();
            tableInfo.Desc = GetTableDesc(dbName,tableName);

            using (var conn = DbHelper.GetConn())
            {
                string sql = $@"
                                  SELECT 
                                  `information_schema`.`COLUMNS`.`COLUMN_NAME`,
                                  `information_schema`.`COLUMNS`.`DATA_TYPE`,
                                  `information_schema`.`COLUMNS`.`COLUMN_COMMENT`
                                  FROM `information_schema`.`COLUMNS`
                                  WHERE `information_schema`.`COLUMNS`.`TABLE_SCHEMA` ='{dbName}' 
	                              and `information_schema`.`COLUMNS`.`TABLE_NAME` = '{tableName}'
                            ";
                using (var reader = conn.ExecuteReader(sql))
                {
                    while (reader.Read())
                    {
                        var paramName = reader["COLUMN_NAME"].ToString();
                        var paramType = reader["DATA_TYPE"].ToString();
                        var desc = reader["COLUMN_COMMENT"].ToString();

                        tableInfo.Parameters.Add(new DbParamInfo
                        {
                            ParamName = paramName,
                            ParamType = GetCLRType(paramType),
                            Desc = desc
                        });
                    }
                }

                return tableInfo;
            }
        }

4.生成实体文件主要方法

        /// <summary>
        ///  生成代码
        /// </summary>
        /// <param name="dbName"></param>
        /// <param name="tableName"></param>
        /// <returns></returns>
        public static string GenerateModel(string dbName,string tableName)
        {
            var data = GetParameterInfos(dbName, tableName);
            var result = Engine.Razor.Run("templateKey", null, data);
            return result;
        }

        /// <summary>
        /// 根据数据库类型获取字段类型
        /// </summary>
        /// <param name="dbType"></param>
        /// <returns></returns>
        private static string GetCLRType(string dbType)
        {
            switch (dbType)
            {
                case "tinyint":
                case "smallint":
                case "mediumint":
                case "int":
                case "integer":
                    return "int";
                case "bigint":
                    return "long";
                case "double":
                    return "double";
                case "float":
                    return "float";
                case "decimal":
                    return "decimal";
                case "numeric":
                case "real":
                    return "decimal";
                case "bit":
                    return "bool";
                case "date":
                case "time":
                case "year":
                case "datetime":
                case "timestamp":
                    return "DateTime";
                case "tinyblob":
                case "blob":
                case "mediumblob":
                case "longblog":
                case "binary":
                case "varbinary":
                    return "byte[]";
                case "char":
                case "varchar":
                case "tinytext":
                case "text":
                case "mediumtext":
                case "longtext":
                    return "string";
                case "point":
                case "linestring":
                case "polygon":
                case "geometry":
                case "multipoint":
                case "multilinestring":
                case "multipolygon":
                case "geometrycollection":
                case "enum":
                case "set":
                default:
                    return dbType;
            }
        }

5.模板文件的辅助方法

        /// <summary>
        /// 首字母小写
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string FirstToLow(string str)
        {
           return str.Substring(0, 1).ToLower() + str.Substring(1);
        }

        /// <summary>
        /// 首字母大写
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string FirstToUp(string str)
        {
            return str.Substring(0, 1).ToUpper() + str.Substring(1);
        }

6.模板文件

@using System
@using CodeHelper.Common
using using System;
namespace CodeHelper
{
    /// <summary>
    /// @Model.Desc
    ///</summary>
    public class @ModelHelper.FirstToUp(Model.TableName)
    {
        @foreach (var pm in  Model.Parameters)
        {
            @:/// <summary>
            @:/// @Raw(pm.Desc)
            @:/// <summary>
            @:private @pm.ParamType @ModelHelper.FirstToLow(pm.ParamName);
            @:
        }

        @foreach (var pm in  Model.Parameters)
        {
            @:public @pm.ParamType @ModelHelper.FirstToUp(pm.ParamName)
            @:{
            @:  get { return @ModelHelper.FirstToLow(pm.ParamName); }
            @:  set { @ModelHelper.FirstToLow(pm.ParamName) = value; }
            @:}
            @:
        }
    }
}

Razor 语法不在这里过多的介绍


三、效果展示

gitee 项目地址:https://gitee.com/tomato23132313/code-helper

 

总结

这里只是实现了非常基础的功能,还有很多可扩展的内容,例如:

多模板的选择、动态配置、给实体增加特性标签、等等

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值