[ASPX] 模版引擎XTemplate与代码生成器XCoder(源码)

模版引擎XTemplate是一个仿T4设计的引擎,功能上基本与T4一致(模版语法上完全兼容T4,模版头指令部分兼容)。

自己设计模版引擎,就是为了代码生成器、网站模版、邮件模版等多种场合,也就是要能拿出来单独使用、功能强大并且容易控制的。T4是个很好的引擎,但是它的设计基本上倾向于vs,几乎不顾别的场合。

XTemplate特点如下:

1,完全使用C#作为模版语言。跟ASP、ASP.Net页面的解析一样,把<##>标签外的文本内容当作字符串,用一个 StringBuilder,标签内作为C#原生代码,拼在一起编译,进行模版替换时,实质上就是执行编译后的程序集,这就是XTemplate的核心原 理!网络上现有的许许多多模版引擎,要么采用标签替换,要么自创模版语言,这些都增加了使用者的学习难度。XTemplate使用C#作为模版语言,这个 世界安静了!

2,支持“调试”。不是运行时调试,而是XTemplate能够把模版编译的中间类文件以及程序集等输出,方便检查错误。如果把模版编译后的程序集保存下来,可以在没有模版文件的情况下直接使用模版功能。

3,不需要ASP.Net支持。有部分模版引擎,是模拟一个ASP.Net服务器,然后以ASP.Net作为模版来实现,这就要求有一个ASP.Net服务器作为宿主,限制了模版引擎的使用范围。

4,支持批量编译。可以把多个模版放入模版处理器,进行一次编译(所有模版类都编译到一个程序集里面去)。

5,支持类成员。模版内容默认情况下将会统一编译到一个类的Render方法里面去,但是有时候我们需要给这个类增加一些属性和方法,此时可以使 用<#! #>标签,序数为单数表示开始,序数为偶数表示结束,所以不限制类成员代码的位置(T4要求只能写在模版的最后面)。

6,支持自定义基类。默认情况下,所有编译生成的模版类都继承自TemplateBase,你也可以创建自己的模版基类,然后在模版头通过指令,或者通过 外部宿主指定自定义的模版基类,模版中可以直接使用自定义模版基类的成员(因为继承嘛),比如代码生成器XCoder中的XCoderBase。

7,自动引用宿主程序集。T4在使用上最大的麻烦就是引用外部程序集和命名空间,毕竟不是在vs里面编写C#代码。XTemplate在编译的时候,自动 引用宿主(就是调用者,比如XCoder)的所有应用程序集,同时引用大部分常用的明明空间,因为这样,生成的类很臃肿,但是编译的时候,编译器会自动去 掉无用的引用。XTemplate从完成到现在为止,还没有用过引用程序集和命名空间的问题,因为一般来说,模版中需要用到的程序集,宿主里面一般都有用 到,非常符合我们的使用习惯。

8,与宿主的良好交互。在XTemplate中,编译的模版程序集是直接加载在默认域,这点与T4不同,T4会新建一个域,应该是为了防止模版代码弄脏默 认域的数据吧(比如干扰vs运行)。因为在同一个域,XTemplate与宿主进行交互,就不需要“FQ”(跨域)了。XTemplate的处理过程分为 分析、编译和执行三步,都可以由外部控制,比如有时候我们只是需要检查一下模版的语法,只需要检查一下模版语法是否正确,这个时候编译一下就可以了。

9,更多的特点需要大家来发现!

XCoder使用XTemplate代码(后面有XCoder的项目代码):

Dictionary<String, Object> data = new Dictionary<string, object>();
data["Config"] = Config;
data["Tables"] = Tables;
data["Table"] = table;

// 声明模版引擎
Template tt = new Template();
Template.Debug = Config.Debug;
foreach (String item in ss)
{
    if (item.EndsWith("scc", StringComparison.Ordinal)) continue;

    String tempFile = item;
    if (!Path.IsPathRooted(tempFile) && !tempFile.StartsWith(TemplatePath, StringComparison.OrdinalIgnoreCase))
        tempFile = Path.Combine(TemplatePath, tempFile);

    String content = File.ReadAllText(tempFile);

    // 添加文件头
    if (Config.UseHeadTemplate && !String.IsNullOrEmpty(Config.HeadTemplate))
        content = Config.HeadTemplate + content;

    tt.AddTemplateItem(item, content);
}
tt.Process();

// 编译模版
tt.Compile();

List<String> rs = new List<string>();
foreach (String item in ss)
{
    if (item.EndsWith("scc", StringComparison.Ordinal)) continue;

    //String content = RenderFile(table, item, data);
    String content = tt.Render(item, data);

    // 计算输出文件名
    String fileName = Path.GetFileName(item);
    String className = CutPrefix(table.Name);
    className = FixWord(className);
    String remark = table.Description;
    if (String.IsNullOrEmpty(remark)) remark = ENameToCName(className);
    if (Config.UseCNFileName && !String.IsNullOrEmpty(remark)) className = remark;
    fileName = fileName.Replace("类名", className).Replace("类说明", remark).Replace("连接名", Config.EntityConnName);

    fileName = Path.Combine(OuputPath, fileName);
    File.WriteAllText(fileName, content, Encoding.UTF8);

    rs.Add(content);
}

XTemplate设计图(我喜欢先做图再编码):

时间: 2024-10-09 22:10:45

[ASPX] 模版引擎XTemplate与代码生成器XCoder(源码)的相关文章

【Drools-开源业务规则引擎】入门实例(含源码)

该实例转自:http://blog.csdn.net/quzishen/article/details/6163012 便于理解的应用实例1: 现在我们模拟一个应用场景:网站伴随业务产生而进行的积分发放操作.比如支付宝信用卡还款奖励积分等. 发放积分可能伴随不同的运营策略和季节性调整,发放数目和规则完全不同,如果使用硬编码的方式去伴随业务调整而修改,代码的修改.管理.优化.测试.上线将是一件非常麻烦的事情,所以,将发放规则部分提取出来,交给Drools管理,可以极大程度的解决这个问题. (注意一

html5游戏服务端引擎(kbengine完整代码+demo源码)

Demo: Ogre. Demo: Unity3d. PyConsole: display server information. PyConsole: Stop the server. Guiconsole: debug. Guiconsole: log. demo视频:http://v.youku.com/v_show/id_XNjU5Nzc0MDQ4.htmldemo下载地址:http://sourceforge.net/projects/kbengine/files/服务端源码:http

Java Activiti 工作流引擎 流程审批 后台框架源码 springmvc SSM

博文来源:http://www.fhadmin.org/webnewsdetail1.html 工作流模块---------------------------------------------------------------------------------------------------------- 1.模型管理    :web在线流程设计器.预览流程xml.导出xml.部署流程 2.流程管理    :导入导出流程资源文件.查看流程图.根据流程实例反射出流程模型.激活挂起 3.

使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码

前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引擎之前,我们可以不那么方便地在我们创建的工程里调试Cocos2d-x的代码,当我们使用了整合后的Cocos引擎,调试Cocos2d-x的代码就变得更加,非常不方便了! 使用Cocos2d-x创建的项目,在最先的版本必须是在Cocos2d-x引擎的目录下,放到其他的位置需要进行各种麻烦的设置,诸如头文

编译 Unity 4.3.1 引擎源码

引言 Unity 官方从 Unity 2017.1 版本开始,开源了引擎和编辑器的C#源码(源码地址:UnityCsReference),但核心的 C/C++ 部分源码并未开源. 编译环境 网上主要的源码有两个版本 Unity 4.3.1f1 和 Unity 4.7.1f1 ,但其实基本都是 4.3.1 的版本,这里以 Unity 4.3 为例进行源码编译,但编译之前需要安装一些工具软件: Visual Studio 2010 (不能使用高版本的 VS 进行源码编译,不然会报错) Visual

16Aspx.com源码2014年7月详细

        Web电子商务网(三层)V2.0源码 2014-07-31   [VS2010] 源码介绍: Web电子商务网(三层)V2.0源码 源码描述: 一.源码特点     采用三层架构开发,购物车功能 二.功能介绍     前台集成了产品在线展示,用户注册.在线调查.在线投稿     后台有类别管理\图书管理\订单管理\会员管理\配送范围管理\邮件列表\广告管理\友情链接管理等     后台添加图书时自动生成缩略图和文字水印     主要参考了petshop的设计架构.使用了Asp.n

jquery2源码分析系列目录

学习jquery的源码对于提高前端的能力很有帮助,下面的系列是我在网上看到的对jquery2的源码的分析.等有时间了好好研究下.我们知道jquery2开始就不支持IE6-8了,从jquery2的源码中可以学到很多w3c新的标准( 如html5,css3,ECMAScript).原文地址是:http://www.cnblogs.com/aaronjs/p/3279314.html 关于1.x.x版的jquery源码分析系列,本博客也转载了一个地址http://www.cnblogs.com/jav

前端源码-部分资源

然后下面链接分享一下,是目前阅读研究源码的一部分资源:jQuery source viewerjquery源码查询这些年.我收集的JQuery代码jquery1.6中的.prop()和.attr()异同第三章<遍历DOM元素>jquery选择器javascript笔记:临摹jQuery(一)jQuery 的原型关系图jquery选择器[原创]jQuery1.8.2源码解析之jQuery.Callbacks[原创] jQuery1.6.1源码分析系列(停止更新)jQuery event(上)jq

远古守卫/cocos2d-x 源码/塔防游戏/高仿王国保卫战

本源码高度模仿IOS游戏王国保卫战,由国外IOS商业开发教程网站raywenderlich内部工程师制作,有非常完整的关卡设计,战斗流程,长达12个关卡,各种敌兵,怪物,箭塔,炮塔一应俱全,还有魔法系统,成就系统以及后台数据库,几乎达到了可以上线的商业游戏级别.代码严格规范,提供了一整套塔防游戏实现的解决方案,如一波波怪如何走出,怪的行走路线,我方小兵行动AI,塔搜索和攻击敌人的AI,代码严格按照MVC(model, view, controller)规范,让人一目了然,复用度极高.可惜原作者只