好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

nodejs + edge + ejs + c#

nodejs + edge + ejs + c#

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。

第二章 需求分析与需求文档

第二章 需求分析与需求文档

   什么是需求分析呢?需求分析是指对要解决的问题进行详细的分析,弄清楚问题的要求。在网页开发当中的“需求分析”就是确定要计算机做什么,所以必须要搞清楚需要什么数据,要得到什么结果,最后输出什么这三方面问题。

软件需求包括三个不同的层次:业务需求、用户需求和功能需求。

业务需求 (Business requirement) 表示企业或客户高层次的目标 。业务需求描述了企业为什么要开发一个网站,也就是希望网站达到的目标,他们通常来自项目投资人、购买产品的客户、实际用户的管理者、市场营销部门或产品策划部门。使用前景和范围(vision and scope)文档来记录业务需求,这份文档有时也被称作项目轮廓图或市场需求(project charter 或 market requirement)文档.

用户需求 (user requirement) 表示的是用户的目标,或用户要求系统必须能完成的任务 。用户需求是从不同的视角,站在用户的角度采集了用户的具体需求描述,加以整理,写出一份文档。也就是说用户需求描述了用户能使用系统来做些什么。

功能需求 (functional requirement) 规定开发人员必须在产品中实现的软件功能,用户利用这些功能来完成任务,满足业务需求 。功能需求有时也被称作行为需求(behavīoral requirement),因为习惯上总是用“应该”对其进行描述:“系统应该发送电子邮件来通知用户已接受其预定”。功能需求描述是开发人员需要实现什么。

    那么需求分析是怎么样的一个过程呢?通过多年工作经验建议采用以下步骤形成网站开发需求:

获取用户需求→用户需求分析→编写需求文档→评审需求文档→管理需求。

下面我们逐步讨论上述做法。

原本获取用户的需求是一个简单的过程,只要客户提供一个完整的需求说明即可,但是事实却非如此,很多客户对自己的需求并不是很清楚,需要您不断引导和帮助分析。曾经有一次,我问客户:“您做网站的目的是什么?”他回答:“没有目的,只是因为别人都有,我没有!”。这样的客户就需要耐心说明,仔细分析,挖掘出他潜在的,真正的需求,配合客户写一份详细的,完整的需求说明会花很多时间,但这样做是值得的,而且一定要让客户满意,签字认可。把好这一关,可以杜绝很多因为需求不明或理解偏差造成的失误和项目失败。

得到用户的需求还要进行深入的分析和整理。分析用户的需求可以遵守下面几条常见的准则:

⑴对于用户提出的每个需求都要知道“为什么”,并判断用户提出的需求是否有充足的理由;

⑵将那种以“如何实现”的表述方式转换为“实现什么”的方式,因为需求分析阶段关注的目标是“做什么”,而不是“怎么做”;

⑶分析由用户需求衍生出的隐含需求,并识别用户没有明确提出来的隐含需求(有可能是实现用户需求的前提条件),这一点往往容易忽略掉,经常因为对隐含需求考虑得不够充分而引起需求变更。

通过对客户的需求分析要使需求说明书达到一下标准就可以了:

1.正确性:每个功能必须清楚描写交付的功能;

2.可行性:确保在当前的开发能力和系统环境下可以实现每个需求;

3.必要性:功能是否必须交付,是否可以推迟实现,是否可以在削减开支情况发生时"砍"掉;

4.简明性:不要使用专业的网络术语;

5.检测性:如果开发完毕,客户可以根据需求检测。

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于nodejs + edge + ejs + c#的详细内容...

  阅读:36次