由浅入深:自己动手开发模板引擎——什么是模板引擎

受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术。本系列文章将会带您由浅入深的全面认识模板引擎的概念、设计、分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎。关于模板引擎的概念,我去年在百度百科上录入了自己的解释(请参考:模板引擎)。老陈曾经自己开发了一套网鸟Asp.Net模板引擎,虽然我自己并不乐意去推广它,但这已经无法阻挡群友的喜爱了!

最初的模板引擎是为了实现业务逻辑和代码分离,后来发现这样的模式给界面维护带来了极大的便利,这也是一种MVC模式的实现。现在我们在很多地方都可以看到模板引擎的身影,比如各种CMS、论坛、代码生成器,甚至是Mootools、JQuery等JavaScript库都用到了模板引擎。那么模板引擎到底是个什么东东呢?模板引擎在实际生产环境中有着什么样的意义?我们到底是否应该使用模板引擎技术?接下来我们会一一解答。

模板引擎是什么?

模板引擎是以业务逻辑层和表现层分离为目的的,将规定格式的模板代码转换为业务数据的算法实现。它可以是一个过程代码、一个类,甚至是一个类库。不同的模板引擎其功用也不尽相同,但其基本原理都差不多。

模板引擎的基本机理就是替换(转换),将指定的标签转换为需要的业务数据;将指定的伪语句按照某种流程来变换输出。最低限度的模板引擎就类似于如下代码的实现:

1 const string message = "{Person}喜欢{Color}";
2
3 var msg = message.Replage("{Person}", person).Replage("{Color}", color);

实际上,我们在开发过程中已经在很多地方不自觉的在使用模板机制了。只不过对于如上的代码,在C#里面有更好的String.Format()可以使用,它自身也是实现了一套模板引擎。

按照具体的实现方式,我将模板引擎分成了三个基本类型:

  1. 置换型模板引擎。置换就是将规定好的文本标记替换为目标内容。这种模板引擎实现简单,除了标签替换之外,很少支持诸如子模板引用、流程控制等。正如上面所说,我们几乎天天都在使用这种模板引擎。置换型模板引擎通常用于业务逻辑不是很复杂的项目,比如生成短信、生成电子邮件,甚至有很多代码生成器也在用它。可以说,置换型模板引擎的思想是整个模板引擎界的基础。
  2. 解释型模板引擎。解释型模板引擎的原理还是标记置换。只不过有了解释器的存在,可以支持更加复杂的标记和语法。后面我们将会介绍一种使用反射机制实现的非常好用的模板引擎。大家都知道,在编程语言中,解释型语言和编译型语言相比行嫩会差出很多,这主要得看解释器如何优化了。
  3. 编译型模板引擎。编译型模板引擎是相对于解释型模板引擎来说的,实际上定名为编译型模板引擎也不太合适,但我也没想到别的好名字,哈!我们将要介绍的编译型模板引擎是Asp.Net网站开发专用的。它通过解析引擎和一系列的算法将我们定义的模板转换为.aspx文件,然后直接访问.aspx文件即可。

模板引擎的应用

在很多时候,模板引擎都是为了实现业务逻辑层和表现层的代码分离,以便于协同开发的。然而也有很多应用不仅如此,比如代码生成器,这里的代码分离实际上是为了能够获得更好的可扩展性。

题外话:在早期,.NET推崇的Web开发模式就只有WebForm,这种模式是让很多高手都望尘莫及且避夷所思的。我个人是从Asp/PHP转移到.NET的,在Asp时代我就开发过自己的模板引擎,PHP环境就更不用说了,开源的带有模板引擎的框架一大把。可以说,除了做.NET的,其他阵营的猴子们其实对于模板引擎一点儿也不陌生。后来,微软推出了MVC框架,我也曾经看过它的实现,基本思想就是把当年的Asp编码方式又给拿了回来而已,在很多地方还是不够方便。我还是坚持了模板引擎的使用。

模板引擎可以实现代码分离,让开发人员各司其职,它也是几乎所有代码生成器的基础组件之一,有了模板引擎,在表现层和最终业务数据上,我们可以拥有更好的可扩展性。

比较好的模板引擎实现,比如老陈的“网鸟Asp.Net模板引擎”,还可以内置模板代码重用、多语言支持、动态页面与静态页面自动均衡等功能。

小结

本文简单的阐述了模板引擎的概念极其用途,从下一篇文章开始,我们将深入探讨实现各种模板引擎所需要用到的开发技术和算法。

由于本系列文章在编写之时并没有系统的规划,因此可能会在适当的时候增删章节。总而言之,模板引擎看似是一个小东西,但要真正从头做起来,却又会显得相当复杂而庞大。各位朋友要做好心理准备!我也尽量从简介绍。

posted @ 2012-03-29 09:13  O.C  阅读(12299)  评论(19编辑  收藏  举报