背景

自从第一次接触代码生成器,就爱上她了。用过ComeSmith和T4,这些代码生成器确实很优秀,为何我还要DIY自己的呢?有如下几点理由:

  1. T4的元数据定义太麻烦,还要定义强类型的元数据类型。
  2. 一直希望用一款动态语言作为工具。

今天就介绍一下,如何用 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#,打造属于自己的代码生成器相关推荐

  1. nodejs express 模板引擎(ejs )

    默认支持的模板引擎: 1 jade (模板比较简洁 html代码区别非常大和使用习惯区别比较大.) 2 ejs (html代码一样) (1)模板文件后缀.ejs (2) 开始<% 结束 %> ...

  2. [Nodejs]基于Nodejs构建属于自己的微信公众号

    摘要: 微信,庞大的用户基数,极强的用户粘性,在近两年吸引了无数的开发者注意力. Nodejs,近两年发展非常快的开发工具,尤其适合构建移动后台.本文就以笔者自己开发的实例,来描述如何基于Nodejs ...

  3. php nodejs 前台,NodeJS之前端注册页面

    本文主要给大家介绍了NodeJS之前端注册页面的相关知识,文中通过示例代码介绍的非常详细,对大家学习具有一定的参考学习价值,希望能帮助到大家. app.js文件为://应用程序的启动入口文件 //加载 ...

  4. [Nodejs]初探nodejs学习笔记- 如何使用nodejs搭建简单的UDP聊天功能

    2019独角兽企业重金招聘Python工程师标准>>> 何为UDP(User Datagram Protocol)? 从baidu摘过来一段:UDP,用户数据报协议,与所熟知的TCP ...

  5. php渲染nodejs api,nodejs通过响应回写渲染页面步骤详解

    这次给大家带来nodejs通过响应回写渲染页面步骤详解,nodejs通过响应回写渲染页面的注意事项有哪些,下面就是实战案例,一起来看一下. 我们一般通过node框架提供的api操作页面渲染,如何利用原 ...

  6. linux定时任务nodejs,让Nodejs来管理定时任务later

    从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏 ...

  7. 【Nodejs】Nodejs入门必知

    https://i5ting.github.io/How-to-learn-node-correctly/#1 1.3.2. 安装Node.js环境 3m安装法 nvm(node version ma ...

  8. php转nodejs 代码,NodeJS实现视频转码的示例代码

    视频转码就是一个先解码,再编码的过程,从而将原来的视频转换成我们需要的视频.这种转换可能包括各式(mp4/avi/flv等).分辨率.码率.帧率等.传统的视频转码中,很常用的工具是FFmpeg.FFm ...

  9. Ubuntu安装nodejs及nodejs升级

    一.安装 sudo apt-get install nodejs sudo apt-get install npm 二.查看是否安装成功及版本 node -v npm -v 三.升级 sudo npm ...

最新文章

  1. 2018 区块链技术及应用峰会(BTA)·中国全日程新鲜出炉,更多精彩议题看不停
  2. FreeRTOS(四)——内存管理
  3. selenium代码练习
  4. python简单语法_python的基本语法(一)
  5. leetcode159. 至多包含两个不同字符的最长子串
  6. 高并发秒杀——SpringBoot集成redis
  7. Android Studio NDK 开发配置
  8. 师妹问我:如何在7分钟内彻底搞懂word2vec?
  9. 恐龙机器人钢索恐龙形态_恐龙有的四脚行走有的两脚行走,有的会飞有的会游,差别咋这么大...
  10. Atitit 延迟绑定架构法attilax总结
  11. Skype国际版使用国内卡
  12. 机器人动力学-牛顿-欧拉方程
  13. 如何在线将WAV转换为MP3格式
  14. 柯桥在PPT中如何制作翻书动画?
  15. Git以及Githup的使用
  16. 0ops CTF/0CTF writeup
  17. 网吧遭雷击“瘫痪” 专家:别忘加保护装置(转)
  18. Python统计数组中多个区间内的频数并画直方图
  19. [HEOI2013]ALO-题解
  20. 南科之旅(南方科技大学夏令营)

热门文章

  1. 网站推广方法众多,对此你了解多少?
  2. tinyumbrella java_tinyumbrella(小雨伞)
  3. java 执行字节码_深入理解java:1.2. 字节码执行引擎
  4. RCNN 目标识别基本原理
  5. mongodb 关闭服务 mongod -f /root/mongodb/bin/xx.conf --shutdown
  6. 按次计费接口的简单实现思路
  7. c# async await 理解 结合并行处理
  8. [python]两种编程思维--面向过程和面向对象
  9. 【linux基础】CMake如何生成动态链接库文件
  10. 37、Django实战第37天:404以及500页面配置