热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

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

    XTemplate特点如下:

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

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

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

    4&#xff0c;支持批量编译。可以把多个模版放入模版处理器&#xff0c;进行一次编译&#xff08;所有模版类都编译到一个程序集里面去&#xff09;。

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

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

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

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

    9&#xff0c;更多的特点需要大家来发现&#xff01;

 

    XCoder使用XTemplate代码&#xff08;后面有XCoder的项目代码&#xff09;&#xff1a;

Dictionary<String, Object> data &#61; new Dictionary<string, object>();
data["Config"] &#61; Config;
data["Tables"] &#61; Tables;
data["Table"] &#61; table;// 声明模版引擎
Template tt &#61; new Template();
Template.Debug &#61; Config.Debug;
foreach (String item in ss)
{if (item.EndsWith("scc", StringComparison.Ordinal)) continue;String tempFile &#61; item;if (!Path.IsPathRooted(tempFile) && !tempFile.StartsWith(TemplatePath, StringComparison.OrdinalIgnoreCase))tempFile &#61; Path.Combine(TemplatePath, tempFile);String content &#61; File.ReadAllText(tempFile);// 添加文件头if (Config.UseHeadTemplate && !String.IsNullOrEmpty(Config.HeadTemplate))content &#61; Config.HeadTemplate &#43; content;tt.AddTemplateItem(item, content);
}
tt.Process();// 编译模版
tt.Compile();List<String> rs &#61; new List<string>();
foreach (String item in ss)
{if (item.EndsWith("scc", StringComparison.Ordinal)) continue;//String content &#61; RenderFile(table, item, data);String content &#61; tt.Render(item, data);// 计算输出文件名String fileName &#61; Path.GetFileName(item);String className &#61; CutPrefix(table.Name);className &#61; FixWord(className);String remark &#61; table.Description;if (String.IsNullOrEmpty(remark)) remark &#61; ENameToCName(className);if (Config.UseCNFileName && !String.IsNullOrEmpty(remark)) className &#61; remark;fileName &#61; fileName.Replace("类名", className).Replace("类说明", remark).Replace("连接名", Config.EntityConnName);fileName &#61; Path.Combine(OuputPath, fileName);File.WriteAllText(fileName, content, Encoding.UTF8);rs.Add(content);
}

 

    XTemplate设计图&#xff08;我喜欢先做图再编码&#xff09;&#xff1a;

XTemplate架构

转:https://www.cnblogs.com/nnhy/archive/2010/11/10/1873398.html



推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
Melody-Zhu1988
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有