zoukankan      html  css  js  c++  java
  • nodejs + edge + ejs + c#

    NodeJs:用 nodejs + edge + ejs + c#,打造属于自己的代码生成器

     

    背景

    自从第一次接触代码生成器,就爱上她了。用过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。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    [iOS]Xcode+GitHub远程代码托管(GIT, SVN)
    [iOS]Xcode处理过时方法的警告
    [iOS]@synthesize和@dynamic关键字
    [iOS]图片高清度太高, 导致内存过大Crash
    [软件]Xcode查找系统framework所在路径
    [软件]在浏览器里添加MarkDown Here(插件)
    [PHP]利用XAMPP搭建本地服务器, 然后利用iOS客户端上传数据到本地服务器中(四. iOS端代码实现)
    ios -Unity3D的EasyAR集成到已经有项目中。
    iOS创建安全的单例
    阿里云轻量应用服务器 配置mysql详解(转载)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3073476.html
Copyright © 2011-2022 走看看