NodeJs:用 nodejs + edge + ejs + c#,打造属于自己的代码生成器
背景
自从第一次接触代码生成器,就爱上她了。用过ComeSmith和T4,这些代码生成器确实很优秀,为何我还要DIY自己的呢?有如下几点理由:
- T4的元数据定义太麻烦,还要定义强类型的元数据类型。
- 一直希望用一款动态语言作为工具。
今天就介绍一下,如何用 nodejs + edge + ejs + c#,打造属于自己的代码生成器。核心外部库介绍:
- edge:允许在nodejs中调用c#代码。
- ejs:基于nodejs的模板引擎。
思路
常见的代码生成器都支持从数据库生成代码,因此思路可以分为两大步骤:一、读取数据库元数据;二、基于模板生成代码。
读取数据库元数据可以用 edge + c#的一个开源类库。
基于模板生成代码可以用 ejs。
实现(代码下载)
项目结构
核心代码
SchemaReader.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using DatabaseSchemaReader; 8 using DatabaseSchemaReader.DataSchema; 9 10 using Happy.Edge.DatabaseSchemaReader.Extentions; 11 12 namespace Happy.Edge.DatabaseSchemaReader 13 { 14 public sealed class SchemaReader 15 { 16 public async Task<object> AllTables(object options) 17 { 18 dynamic dynamicOptions = options; 19 20 var dbReader = new DatabaseReader( 21 dynamicOptions["connectionString"], 22 dynamicOptions["providerName"]); 23 24 return dbReader 25 .AllTables() 26 .Select(table => table.ToDynamic()) 27 .ToList(); 28 } 29 } 30 }
SchemaReader.js
1 var edge = require('edge'); 2 var path = require('path'); 3 var ejs = require('ejs'); 4 var fs = require('fs'); 5 6 exports.allTables = edge.func({ 7 assemblyFile: path.resolve(__dirname, './lib/bin/Happy.Edge.DatabaseSchemaReader.dll'), 8 typeName: 'Happy.Edge.DatabaseSchemaReader.SchemaReader', 9 methodName: 'AllTables' 10 }); 11 12 exports.allTables({ 13 providerName: 'System.Data.SqlClient', 14 connectionString: 'Data Source=(LocalDB)\\v11.0;AttachDbFilename=E:\\Happy.Edge\\database_schem_reader\\test_database\\Test.mdf;Integrated Security=True;Connect Timeout=30' 15 }, renderTables); 16 17 function renderTables(error, tables) { 18 tables.forEach(function (table) { 19 renderTable(table); 20 }); 21 } 22 23 function renderTable(table) { 24 var str = fs.readFileSync(__dirname + '/Templates/Entity.ejs', 'utf8'); 25 26 console.log(ejs.render(str, table)); 27 }
备注
这个示例只是验证了这种可能性,这种理念可以延伸到其它工具开发。感谢edge。
转载于:https://www.cnblogs.com/happyframework/archive/2013/05/11/3072387.html
NodeJs:用 nodejs + edge + ejs + c#,打造属于自己的代码生成器相关推荐
- nodejs express 模板引擎(ejs )
默认支持的模板引擎: 1 jade (模板比较简洁 html代码区别非常大和使用习惯区别比较大.) 2 ejs (html代码一样) (1)模板文件后缀.ejs (2) 开始<% 结束 %> ...
- [Nodejs]基于Nodejs构建属于自己的微信公众号
摘要: 微信,庞大的用户基数,极强的用户粘性,在近两年吸引了无数的开发者注意力. Nodejs,近两年发展非常快的开发工具,尤其适合构建移动后台.本文就以笔者自己开发的实例,来描述如何基于Nodejs ...
- php nodejs 前台,NodeJS之前端注册页面
本文主要给大家介绍了NodeJS之前端注册页面的相关知识,文中通过示例代码介绍的非常详细,对大家学习具有一定的参考学习价值,希望能帮助到大家. app.js文件为://应用程序的启动入口文件 //加载 ...
- [Nodejs]初探nodejs学习笔记- 如何使用nodejs搭建简单的UDP聊天功能
2019独角兽企业重金招聘Python工程师标准>>> 何为UDP(User Datagram Protocol)? 从baidu摘过来一段:UDP,用户数据报协议,与所熟知的TCP ...
- php渲染nodejs api,nodejs通过响应回写渲染页面步骤详解
这次给大家带来nodejs通过响应回写渲染页面步骤详解,nodejs通过响应回写渲染页面的注意事项有哪些,下面就是实战案例,一起来看一下. 我们一般通过node框架提供的api操作页面渲染,如何利用原 ...
- linux定时任务nodejs,让Nodejs来管理定时任务later
从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏 ...
- 【Nodejs】Nodejs入门必知
https://i5ting.github.io/How-to-learn-node-correctly/#1 1.3.2. 安装Node.js环境 3m安装法 nvm(node version ma ...
- php转nodejs 代码,NodeJS实现视频转码的示例代码
视频转码就是一个先解码,再编码的过程,从而将原来的视频转换成我们需要的视频.这种转换可能包括各式(mp4/avi/flv等).分辨率.码率.帧率等.传统的视频转码中,很常用的工具是FFmpeg.FFm ...
- Ubuntu安装nodejs及nodejs升级
一.安装 sudo apt-get install nodejs sudo apt-get install npm 二.查看是否安装成功及版本 node -v npm -v 三.升级 sudo npm ...
最新文章
- 2018 区块链技术及应用峰会(BTA)·中国全日程新鲜出炉,更多精彩议题看不停
- FreeRTOS(四)——内存管理
- selenium代码练习
- python简单语法_python的基本语法(一)
- leetcode159. 至多包含两个不同字符的最长子串
- 高并发秒杀——SpringBoot集成redis
- Android Studio NDK 开发配置
- 师妹问我:如何在7分钟内彻底搞懂word2vec?
- 恐龙机器人钢索恐龙形态_恐龙有的四脚行走有的两脚行走,有的会飞有的会游,差别咋这么大...
- Atitit 延迟绑定架构法attilax总结
- Skype国际版使用国内卡
- 机器人动力学-牛顿-欧拉方程
- 如何在线将WAV转换为MP3格式
- 柯桥在PPT中如何制作翻书动画?
- Git以及Githup的使用
- 0ops CTF/0CTF writeup
- 网吧遭雷击“瘫痪” 专家:别忘加保护装置(转)
- Python统计数组中多个区间内的频数并画直方图
- [HEOI2013]ALO-题解
- 南科之旅(南方科技大学夏令营)
热门文章
- 网站推广方法众多,对此你了解多少?
- tinyumbrella java_tinyumbrella(小雨伞)
- java 执行字节码_深入理解java:1.2. 字节码执行引擎
- RCNN 目标识别基本原理
- mongodb 关闭服务 mongod -f /root/mongodb/bin/xx.conf --shutdown
- 按次计费接口的简单实现思路
- c# async await 理解 结合并行处理
- [python]两种编程思维--面向过程和面向对象
- 【linux基础】CMake如何生成动态链接库文件
- 37、Django实战第37天:404以及500页面配置