详解模版引擎XTemplate与代码生成器XCode(源码)

移动开发 iOS
模版引擎XTemplate与代码生成器XCode是本文要介绍的内容,主要是来学习模版引擎XTemplate是一个仿T4设计的引擎,功能上基本与T4一致,来看详细内容。

模版引擎XTemplate与代码生成器XCode是本文要介绍的内容,主要是来学习模版引擎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,你也可以创建自己的模版基类,然后在模版头通过指令,或者通过外部宿主指定自定义的模版基类,模版中可以直接使用自定义模版基类的成员(因为继承嘛),比如代码生成器XCode中的XCodeBase。

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

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

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

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

  1. Dictionary<String, Object> data = new Dictionary<string, object>();  
  2. data["Config"] = Config;  
  3. data["Tables"] = Tables;  
  4. data["Table"] = table;  
  5.  
  6. // 声明模版引擎  
  7. Template tt = new Template();  
  8. Template.Debug = Config.Debug;  
  9. foreach (String item in ss)  
  10. {  
  11.     if (item.EndsWith("scc", StringComparison.Ordinal)) continue;  
  12.  
  13.     String tempFile = item;  
  14.     if (!Path.IsPathRooted(tempFile) && !tempFile.StartsWith(TemplatePath, StringComparison.OrdinalIgnoreCase))  
  15.         tempFile = Path.Combine(TemplatePath, tempFile);  
  16.  
  17.     String content = File.ReadAllText(tempFile);  
  18.  
  19.     // 添加文件头  
  20.     if (Config.UseHeadTemplate && !String.IsNullOrEmpty(Config.HeadTemplate))  
  21.         content = Config.HeadTemplate + content;  
  22.  
  23.     tt.AddTemplateItem(item, content);  
  24. }  
  25. tt.Process();  
  26.  
  27. // 编译模版  
  28. tt.Compile();  
  29.  
  30. List<String> rs = new List<string>();  
  31. foreach (String item in ss)  
  32. {  
  33.     if (item.EndsWith("scc", StringComparison.Ordinal)) continue;  
  34.  
  35.     //String content = RenderFile(table, item, data);  
  36.     String content = tt.Render(item, data);  
  37.  
  38.     // 计算输出文件名  
  39.     String fileName = Path.GetFileName(item);  
  40.     String className = CutPrefix(table.Name);  
  41.     className = FixWord(className);  
  42.     String remark = table.Description;  
  43.     if (String.IsNullOrEmpty(remark)) remark = ENameToCName(className);  
  44.     if (Config.UseCNFileName && !String.IsNullOrEmpty(remark)) className = remark;  
  45.     fileNamefileName = fileName.Replace("类名", className).Replace("类说明", remark).Replace("连接名", Config.EntityConnName);  
  46.  
  47.     fileName = Path.Combine(OuputPath, fileName);  
  48.     File.WriteAllText(fileName, content, Encoding.UTF8);  
  49.  
  50.     rs.Add(content);  

XTemplate设计图(我喜欢先做图再编码)单击放大:

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

小结:详解模版引擎XTemplate与代码生成器XCode(源码)的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: CSDN博客
相关推荐

2023-05-17 16:02:00

CSS工具代码生成器

2017-03-20 17:49:21

Java Web模板代码

2021-07-23 11:24:54

Create Inc开源G代码生成器

2015-08-25 15:54:17

程序员代码生成器

2023-01-06 07:52:52

代码生成器开发

2024-11-01 15:51:06

2012-03-30 09:31:44

WEBCSS

2021-12-10 09:45:19

生成器配置代码

2021-10-29 11:25:41

代码编程语言Java

2020-10-20 09:53:11

代码IDEA生成器

2011-12-23 13:42:05

JavaScript

2010-09-07 16:31:17

SQL语句insert

2021-04-22 21:15:38

Generator函数生成器

2015-08-25 11:07:58

2017-07-01 16:02:39

分布式ID生成器

2024-06-12 13:40:58

2009-07-03 09:29:24

KeelKit

2022-03-10 10:48:30

PolyCoder自动代码生成器语言

2020-05-25 16:18:33

SpringBoot代码生成器

2015-04-22 09:36:27

JAVA代码生成器
点赞
收藏

51CTO技术栈公众号