﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Cavingdeep的技术专栏</title><link>http://www.cnblogs.com/cavingdeep/</link><description>软件开发与工程，又一种艺术。</description><language>zh-cn</language><lastBuildDate>Sat, 04 Jul 2009 13:31:34 GMT</lastBuildDate><pubDate>Sat, 04 Jul 2009 13:31:34 GMT</pubDate><ttl>60</ttl><item><title>用metaclass实现AOP风格的Profiler</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Tue, 22 Aug 2006 02:36:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/483056.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483056.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/483056.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/483056.html</trackback:ping><description><![CDATA[以下是一段通过metaclass实现Profiler的Python代码，很简单，功能不多，目的是为了展示Python的meta
programming的能力，这种能力，无疑是很实用的，而且可以将AOP的方面（aspect）概念发挥的很好！下面的Profiler类（metaclass）就可以将方法的profiling在不同的类中复用。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Profiler(type):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__new__</span><span style="color: #000000;">(mcl,&nbsp;name,&nbsp;bases,&nbsp;dict):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;time&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;clock<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;types&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;FunctionType<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;timing(func):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;wrapper(</span><span style="color: #000000;">*</span><span style="color: #000000;">args,&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">kwds):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;clock()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;func(</span><span style="color: #000000;">*</span><span style="color: #000000;">args,&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">kwds)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;clock()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;func.</span><span style="color: #800080;">__name__</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">takes</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;(end&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;start),&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">seconds</span><span style="color: #800000;">'</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;wrapper<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;attr,&nbsp;value&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;dict.iteritems():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;isinstance(value,&nbsp;FunctionType):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dict[attr]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;timing(value)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;super(Profiler,&nbsp;mcl).</span><span style="color: #800080;">__new__</span><span style="color: #000000;">(mcl,&nbsp;name,&nbsp;bases,&nbsp;dict)<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;A(object):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">__metaclass__</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Profiler<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;foo(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;range(</span><span style="color: #000000;">100000</span><span style="color: #000000;">):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;total</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;total<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;foo2(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;time&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;sleep<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;range(</span><span style="color: #000000;">100000</span><span style="color: #000000;">):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;total</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000;">0.0001</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;total<br><br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;main():<br>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;A()<br>&nbsp;&nbsp;&nbsp;&nbsp;a.foo()<br>&nbsp;&nbsp;&nbsp;&nbsp;a.foo2()<br><br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__name__</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;main()<br></span></div>
<br><br>此篇为抛砖引玉，希望大家能制作出更多更强的metaclass来，然后不妨与我们分享！:)
<br>  <img src ="http://www.cnblogs.com/cavingdeep/aggbug/483056.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Singleton implementation using metaclass</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483054.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Tue, 22 Aug 2006 02:34:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483054.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/483054.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/08/22/483054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/483054.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/483054.html</trackback:ping><description><![CDATA[这里是一段Python代码，展示了如何利用metaclass来实现一个通用的Singleton，这使任何一个class都可以简单的复用这一行为：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Singleton(type):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__call__</span><span style="color: #000000;">(cls,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">args):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;hasattr(cls,&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">instance</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cls.instance&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;super(Singleton,&nbsp;cls).</span><span style="color: #800080;">__call__</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #000000;">args)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cls.instance<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Cache(object):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080;">__metaclass__</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Singleton<br><br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;main():<br>&nbsp;&nbsp;&nbsp;&nbsp;cache&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Cache()<br>&nbsp;&nbsp;&nbsp;&nbsp;cache.data1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">data1&nbsp;==&nbsp;%s</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;cache.data1<br><br>&nbsp;&nbsp;&nbsp;&nbsp;cache2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Cache()<br>&nbsp;&nbsp;&nbsp;&nbsp;cache2.data1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cache2.data1&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">data1&nbsp;is&nbsp;increased&nbsp;by&nbsp;1.</span><span style="color: #800000;">'</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">data1&nbsp;==&nbsp;%s</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;cache.data1<br><br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__name__</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">__main__</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;main()<br></span></div>
<br><br>这是一个简单的meta
programming的应用展示，展示了metaclass所蕴涵的强大的能力，只要想得到，metaclass可以实现各种各样用通常手法做不到或很难实现的功能。:D<br>  <img src ="http://www.cnblogs.com/cavingdeep/aggbug/483054.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>初试IronPython与.NET的集成</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/08/01/464781.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Tue, 01 Aug 2006 03:06:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/08/01/464781.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/464781.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/08/01/464781.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/464781.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/464781.html</trackback:ping><description><![CDATA[<p>在得知IronPython如今已步入1.0 RC1后兴奋不已，赶快下载下来试用。虽说功能性变化不多（加入了试用性Python 2.5的语法支持:D），但稳定性如今已提高了不少，应该说可以用来投入正式使用了。:)</p>
<p><strong>如何用好IronPython</strong></p>
<p>翻看了一下Tutorials，发现和以前的内容差不多，按照Tutorials中的方法尝试了一下在C#中嵌入IronPython 代码，发现还很不错，最起码可行，虽然速度肯定没有用C#直接写出来的快（因为IronPython需要动态编译的缘故）。</p>
<p>好的，现在我们拥有了一项较稳定的可以投入使用的新技术了，但是如果没有市场，那么这个新技术是不能够生存的，所以我左思右想 IronPython在企业级开发中到底占了什么地位（因为我是做企业级开发的:)），有何等优势呢？通过分析现有IronPython的特征，我得到了一个结论，那就是它比较适合做脚本引擎或者简单的客户端。以下是我分析的IronPython的一些特征：</p>
<ol>
    <li>Python的语法，灵活性相当的高！
    </li>
    <li>与.NET Framework的交互实现的非常的好，现在用Python的语法也可以用.NET的类库了。
    </li>
    <li>在其他.NET语言中可以通过引用IronPython.dll来执行IronPython文件并且可以实现内存共享（在同一AppDomain中）。
    </li>
    <li>纯IronPython程序启动非常慢。
    </li>
    <li>由于IronPython的特殊性，它所编译出来的程序集中的成员并非你所想象的，所以不能够由其他程序集直接引用使用。这主要还是因为Python是一种动态类型语言，所以无法在编译时给予合适的静态类型（唯一合适的就是System.Object）。另外为了与CPython保持兼容性，IronPython也是以module为单位进行group的，也就是一个module被编译成一个类，这个module中的所有成员，包括class都被当作成员编译在这个类中。 </li>
</ol>
<p>基于以上一些IronPython现有的特征来看，我觉得它更适合使用.NET 程序集，而非为.NET程序提供功能（虽然也是可行的，也是我希望的），所以我建议将IronPython用作客户端以及脚本引擎一类的用途上，因为这类程序是属于consumer类的，它们使用现成的API，但是它们不为其他人提供新的API。</p>
<p><strong>如何用IronPython为.NET程序提供API</strong></p>
<p>读者可能会说我自相矛盾，刚刚才说过IronPython不适合用来提供API，怎么现在又提起这件事来了呢（唉，人本身就是一种很矛盾的生物）？！其实就像上面我在括号中提及的，利用IronPython的交互能力与语言的灵活性为我的.NET程序提供简化的解决方案是我的期望，虽然速度方面还不尽人意，但优化的空间永远都是存在的，我相信随着时间的推移IronPython会在性能方面做的更出色（从这方面来看我是个乐观主义者:D）。</p>
<p>为了简化主程序与IronPython文件的交互与维护难度，我决定将IronPython文件作为服务（service）来看待，IronPython所提供的每一个API就是一个独立的服务，每次需要使用这个服务的时候我只需向它发送相应的消息（message）即可，而它，会返回给我一个回应（response）如果有必要的话。我觉得这样做比较符合目前的SOA潮流。（如果你还不知道SOA是什么的话，一句话告诉你，它是一种企业级集成手段）</p>
<p>我的做法很简单，只是初步实现了一个对IronPython文件调用的封装，示例如下。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;a.Add(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;a.Add(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;a.Add(</span><span style="color: #000000;">3</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;b.Add(</span><span style="color: #000000;">4</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;b.Add(</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;b.Add(</span><span style="color: #000000;">6</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;PyFacade</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">IList</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;&gt;&gt;</span><span style="color: #000000;">&nbsp;py&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PyFacade</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">IList</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;&gt;&gt;</span><span style="color: #000000;">();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;py.PythonFile&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">mayorThenTen.py</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;py.Arguments.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">listA</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;a);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;py.Arguments.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">listB</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;b);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;py.Execute();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img id="Codehighlighter1_369_480_Open_Image" onclick="this.style.display='none'; codehighlighter1_369_480_open_text.style.display="'none';" codehighlighter1_369_480_closed_image.style.display="'inline';" codehighlighter1_369_480_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_369_480_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_369_480_closed_text.style.display="'none';" codehighlighter1_369_480_open_image.style.display="'inline';" codehighlighter1_369_480_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(IList</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;tuple&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;py.Result)&nbsp;</span><span id="Codehighlighter1_369_480_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_369_480_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(tuple[</span><span style="color: #000000;">0</span><span style="color: #000000;">]);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(tuple[</span><span style="color: #000000;">1</span><span style="color: #000000;">]);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">&nbsp;}</span></span></div>
<p>PyFacade的代码如下。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.Collections.Generic;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;IronPython.Hosting;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img id="Codehighlighter1_104_992_Open_Image" onclick="this.style.display='none'; codehighlighter1_104_992_open_text.style.display="'none';" codehighlighter1_104_992_closed_image.style.display="'inline';" codehighlighter1_104_992_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_104_992_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_104_992_closed_text.style.display="'none';" codehighlighter1_104_992_open_image.style.display="'inline';" codehighlighter1_104_992_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;Cavingdeep.Python&nbsp;</span><span id="Codehighlighter1_104_992_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_104_992_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_134_990_Open_Image" onclick="this.style.display='none'; codehighlighter1_134_990_open_text.style.display="'none';" codehighlighter1_134_990_closed_image.style.display="'inline';" codehighlighter1_134_990_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_134_990_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_134_990_closed_text.style.display="'none';" codehighlighter1_134_990_open_image.style.display="'inline';" codehighlighter1_134_990_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PyFacade</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_134_990_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_134_990_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;ResultVariableName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">_result_</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;PythonEngine&nbsp;engine&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PythonEngine();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;pythonFile;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Result</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Result</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;IDictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;args&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_458_545_Open_Image" onclick="this.style.display='none'; codehighlighter1_458_545_open_text.style.display="'none';" codehighlighter1_458_545_closed_image.style.display="'inline';" codehighlighter1_458_545_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_458_545_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_458_545_closed_text.style.display="'none';" codehighlighter1_458_545_open_image.style.display="'inline';" codehighlighter1_458_545_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;PythonFile&nbsp;</span><span id="Codehighlighter1_458_545_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_458_545_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_473_497_Open_Image" onclick="this.style.display='none'; codehighlighter1_473_497_open_text.style.display="'none';" codehighlighter1_473_497_closed_image.style.display="'inline';" codehighlighter1_473_497_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_473_497_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_473_497_closed_text.style.display="'none';" codehighlighter1_473_497_open_image.style.display="'inline';" codehighlighter1_473_497_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_473_497_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_473_497_Open_Text"><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pythonFile;}</span></span><span style="color: #000000;"><br><img id="Codehighlighter1_512_537_Open_Image" onclick="this.style.display='none'; codehighlighter1_512_537_open_text.style.display="'none';" codehighlighter1_512_537_closed_image.style.display="'inline';" codehighlighter1_512_537_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_512_537_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_512_537_closed_text.style.display="'none';" codehighlighter1_512_537_open_image.style.display="'inline';" codehighlighter1_512_537_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_512_537_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_512_537_Open_Text"><span style="color: #000000;">{</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pythonFile&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_570_619_Open_Image" onclick="this.style.display='none'; codehighlighter1_570_619_open_text.style.display="'none';" codehighlighter1_570_619_closed_image.style.display="'inline';" codehighlighter1_570_619_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_570_619_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_570_619_closed_text.style.display="'none';" codehighlighter1_570_619_open_image.style.display="'inline';" codehighlighter1_570_619_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;T&nbsp;Result&nbsp;</span><span id="Codehighlighter1_570_619_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_570_619_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_585_611_Open_Image" onclick="this.style.display='none'; codehighlighter1_585_611_open_text.style.display="'none';" codehighlighter1_585_611_closed_image.style.display="'inline';" codehighlighter1_585_611_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_585_611_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_585_611_closed_text.style.display="'none';" codehighlighter1_585_611_open_image.style.display="'inline';" codehighlighter1_585_611_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_585_611_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_585_611_Open_Text"><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.result.Value;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_672_713_Open_Image" onclick="this.style.display='none'; codehighlighter1_672_713_open_text.style.display="'none';" codehighlighter1_672_713_closed_image.style.display="'inline';" codehighlighter1_672_713_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_672_713_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_672_713_closed_text.style.display="'none';" codehighlighter1_672_713_open_image.style.display="'inline';" codehighlighter1_672_713_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;IDictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;Arguments&nbsp;</span><span id="Codehighlighter1_672_713_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_672_713_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_687_705_Open_Image" onclick="this.style.display='none'; codehighlighter1_687_705_open_text.style.display="'none';" codehighlighter1_687_705_closed_image.style.display="'inline';" codehighlighter1_687_705_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_687_705_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_687_705_closed_text.style.display="'none';" codehighlighter1_687_705_open_image.style.display="'inline';" codehighlighter1_687_705_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_687_705_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_687_705_Open_Text"><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.args;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_744_985_Open_Image" onclick="this.style.display='none'; codehighlighter1_744_985_open_text.style.display="'none';" codehighlighter1_744_985_closed_image.style.display="'inline';" codehighlighter1_744_985_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_744_985_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_744_985_closed_text.style.display="'none';" codehighlighter1_744_985_open_image.style.display="'inline';" codehighlighter1_744_985_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Execute()&nbsp;</span><span id="Codehighlighter1_744_985_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_744_985_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.Globals[ResultVariableName]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.result;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_870_930_Open_Image" onclick="this.style.display='none'; codehighlighter1_870_930_open_text.style.display="'none';" codehighlighter1_870_930_closed_image.style.display="'inline';" codehighlighter1_870_930_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_870_930_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_870_930_closed_text.style.display="'none';" codehighlighter1_870_930_open_image.style.display="'inline';" codehighlighter1_870_930_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(KeyValuePair</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;arg&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.args)&nbsp;</span><span id="Codehighlighter1_870_930_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_870_930_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.Globals[arg.Key]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;arg.Value;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;engine.ExecuteFile(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pythonFile);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span></div>
<p>Result的代码如下。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img id="Codehighlighter1_43_100_Open_Image" onclick="this.style.display='none'; codehighlighter1_43_100_open_text.style.display="'none';" codehighlighter1_43_100_closed_image.style.display="'inline';" codehighlighter1_43_100_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_43_100_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_43_100_closed_text.style.display="'none';" codehighlighter1_43_100_open_image.style.display="'inline';" codehighlighter1_43_100_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;Cavingdeep.Python&nbsp;</span><span id="Codehighlighter1_43_100_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_43_100_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_71_98_Open_Image" onclick="this.style.display='none'; codehighlighter1_71_98_open_text.style.display="'none';" codehighlighter1_71_98_closed_image.style.display="'inline';" codehighlighter1_71_98_closed_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_71_98_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_71_98_closed_text.style.display="'none';" codehighlighter1_71_98_open_image.style.display="'inline';" codehighlighter1_71_98_open_text.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Result</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_71_98_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id="Codehighlighter1_71_98_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;T&nbsp;Value;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span></div>
<p>mayorThenTen.py的代码如下，这是这个示例中用到的IronPython文件。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;mayorThenTen(a,&nbsp;b):<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;[(x,&nbsp;y)&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;b&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">]<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;globals().has_key(</span><span style="color: #800000;">'</span><span style="color: #800000;">_result_</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;_result_.Value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mayorThenTen(listA,&nbsp;listB)<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"></span></div>
<p>这里的这个PyFacade是个比较通用的与IronPython交互的接口类，在真正的应用中建议用强类型模式（<a href="http://www.cnblogs.com/cavingdeep/archive/2005/01/31/208952.html" target="_blank">强类型设计实践</a>）加以封装以得到type safety等好处。</p>
<p>关于PyFacade是如何与IronPython文件交互一题，简单地说就是通过那个<em>_result_</em>变量，它会在IronPython文件中被赋值，这个值是外界可见的，也就是说IronPython文件的执行与当前程序是在一个AppDomain中的。有关这类知识感兴趣的读者可以去研究一下动态编译、加载与程序域（AppDomain）等知识。</p><img src ="http://www.cnblogs.com/cavingdeep/aggbug/464781.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47969/" target="_blank">新浪邮箱大本营粉墨登场！Sina.cn开放注册</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Refactoring as a way to improve the existing design</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/07/15/451195.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Sat, 15 Jul 2006 01:04:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/07/15/451195.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/451195.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/07/15/451195.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/451195.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/451195.html</trackback:ping><description><![CDATA[<p>Share with you a refactoring web site maintained by the mighty '<b>Martin Fowler</b>':<br><br><a href="http://www.refactoring.com/" target="_blank">http://www.refactoring.com/</a><br><br>You can find up to 93 refactoring methods in the catalog of this web site, 21 more than listed in book <i>&lt;Refactoring: Improve the Design of Existing Code&gt;</i>. Understanding the importance of refactoring can help you write robust and mantainable code, an essential weapon for today's agile business.<br></p><img src ="http://www.cnblogs.com/cavingdeep/aggbug/451195.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>用metaclass来实现AOP</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/04/28/387175.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Fri, 28 Apr 2006 01:05:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/04/28/387175.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/387175.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/04/28/387175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/387175.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/387175.html</trackback:ping><description><![CDATA[<p>meta-programming是AOP实现的经常性手段，而这里要展示的，是利用Python的metaclass能力来实现 AOP。</p>
<p>当a的setx方法被调用时，会被&#8220;拦截&#8221;，先输出pre...然后是原始setx的方法调用，最后输出post...</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MetaAll(type):<br>&nbsp;&nbsp;&nbsp;def&nbsp;__new__(mcl,&nbsp;name,&nbsp;bases,&nbsp;dict):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;log(func):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;f(</span><span style="color: #000000;">*</span><span style="color: #000000;">args,&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">kwds):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">pre&nbsp;%s</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;func.__name__<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;func(</span><span style="color: #000000;">*</span><span style="color: #000000;">args,&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">kwds)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">post&nbsp;%s</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;func.__name__<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;f<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;attr,&nbsp;value&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;dict.iteritems():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;attr.startswith(</span><span style="color: #000000;">'</span><span style="color: #000000;">set</span><span style="color: #000000;">'</span><span style="color: #000000;">):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dict[attr]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log(value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;super(MetaAll,&nbsp;mcl).__new__(mcl,&nbsp;name,&nbsp;bases,&nbsp;dict)<br><br>__metaclass__&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MetaAll<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;A:<br>&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;def&nbsp;getx(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;self.__x<br><br>&nbsp;&nbsp;&nbsp;def&nbsp;setx(self,&nbsp;value):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value<br><br>a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;A()<br>a.setx(</span><span style="color: #000000;">2</span><span style="color: #000000;">)<br>print&nbsp;a.getx()</span></div>
<p>看到那个__metaclass__变量了吗？如果你赋给它另外一个metaclass的话它会产生其他效应（我这里做的是 logging，其他的可能有例如timing、access control、transaction, etc.），这是魔法！^_^ 最魔力十足的地方是我甚至可以把一个metaclass传进模块中去，给__metaclass__动态的赋值（赋metaclass），这意味着我可以通过meta-programming动态的改变我程序的逻辑，或者不需要改动原有代码即可添加新功能（或修改）等特点！</p>
<p>整个演示就当作抛砖引玉吧，代码我就不细讲了，因为概念太复杂了，不是一两句能说得明白的。有兴趣的朋友可以研究一下Python。; -)</p><img src ="http://www.cnblogs.com/cavingdeep/aggbug/387175.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>不该用Generics实现Abstract Factory的理由</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/03/24/357434.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Fri, 24 Mar 2006 02:24:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/03/24/357434.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/357434.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/03/24/357434.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/357434.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/357434.html</trackback:ping><description><![CDATA[<p>最近在与<a href="http://ninputer.cnblogs.com/" target=_blank>Ninputer</a>争执.NET与Java的泛型特点，他的意见是.NET的Generics要更强（实现层面与语法层面两个层面），我的意见是Java的Generics的语法层面要更强（语法层面的强主要是指易用性）。他让我看了一篇用.NET Generics实现的Abstract Factory的文章<a href="http://blog.joycode.com/ninputer/archive/2006/01/12/70313.aspx" target=_blank>http://blog.joycode.com/ninputer/archive/2006/01/12/70313.aspx</a>，说如果用Java就会遇到很多麻烦。因为我也是初学Java的Generics，所以比较感兴趣这个话题，看了一下文章后做了一些实现后得出了以下一些结论。</p>
<p><strong>该不该使用Generics实现Abstract Factory？</strong></p>
<p>我的意见是不应该，理由如下：</p>
<ol>
    <li>具体创建对象的时候，也就是在ConcreteFactory中，不是所有情况都是简单地一个new操作就算是创造对象了，就像它的名字所示那样，具体对象具体操作，这里不能泛化，一定要根据具体类型来实现对象创建。
    <li>就像许多人提到的，到底用多少个type variable才算合适呢？AbstractFactory&lt;A, B&gt;, AbstractFactory&lt;A, B, C&gt; ??? 简单地说，Abstract Factory是不能够定量的，目前.NET与Java的泛型都不能实现这点。 </li>
</ol>
<p><strong>Java的泛型真的那么弱吗？如果要实现定量的Abstract Factory真的很难吗？</strong></p>
<p>我的答案是否，实际上，我觉得用Java的语法无论在实现上的阅读与易用性都要比.NET的语法强。下面是我给出的Abstract Factory的实现，虽然我说过，用Generics实现Abstract Factory并不合适。</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_20_21_Open_Image onclick="this.style.display='none'; Codehighlighter1_20_21_Open_Text.style.display='none'; Codehighlighter1_20_21_Closed_Image.style.display='inline'; Codehighlighter1_20_21_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_20_21_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_20_21_Closed_Text.style.display='none'; Codehighlighter1_20_21_Open_Image.style.display='inline'; Codehighlighter1_20_21_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;Processor&nbsp;</span><span id=Codehighlighter1_20_21_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_20_21_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_38_39_Open_Image onclick="this.style.display='none'; Codehighlighter1_38_39_Open_Text.style.display='none'; Codehighlighter1_38_39_Closed_Image.style.display='inline'; Codehighlighter1_38_39_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_38_39_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_38_39_Closed_Text.style.display='none'; Codehighlighter1_38_39_Open_Image.style.display='inline'; Codehighlighter1_38_39_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;Ram&nbsp;</span><span id=Codehighlighter1_38_39_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_38_39_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_86_87_Open_Image onclick="this.style.display='none'; Codehighlighter1_86_87_Open_Text.style.display='none'; Codehighlighter1_86_87_Closed_Image.style.display='inline'; Codehighlighter1_86_87_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_86_87_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_86_87_Closed_Text.style.display='none'; Codehighlighter1_86_87_Open_Image.style.display='inline'; Codehighlighter1_86_87_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;PentiumProcessor&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;Processor&nbsp;</span><span id=Codehighlighter1_86_87_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_86_87_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_118_119_Open_Image onclick="this.style.display='none'; Codehighlighter1_118_119_Open_Text.style.display='none'; Codehighlighter1_118_119_Closed_Image.style.display='inline'; Codehighlighter1_118_119_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_118_119_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_118_119_Closed_Text.style.display='none'; Codehighlighter1_118_119_Open_Image.style.display='inline'; Codehighlighter1_118_119_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;DDRRam&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;Ram&nbsp;</span><span id=Codehighlighter1_118_119_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_118_119_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_156_192_Open_Image onclick="this.style.display='none'; Codehighlighter1_156_192_Open_Text.style.display='none'; Codehighlighter1_156_192_Closed_Image.style.display='inline'; Codehighlighter1_156_192_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_156_192_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_156_192_Closed_Text.style.display='none'; Codehighlighter1_156_192_Open_Image.style.display='inline'; Codehighlighter1_156_192_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;AbstractFactory</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">PA,&nbsp;PB</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_156_192_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_156_192_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;PA&nbsp;createA();<br><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;PB&nbsp;createB();<br><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_267_456_Open_Image onclick="this.style.display='none'; Codehighlighter1_267_456_Open_Text.style.display='none'; Codehighlighter1_267_456_Closed_Image.style.display='inline'; Codehighlighter1_267_456_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_267_456_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_267_456_Closed_Text.style.display='none'; Codehighlighter1_267_456_Open_Image.style.display='inline'; Codehighlighter1_267_456_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;IntelFactory&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;AbstractFactory</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">PentiumProcessor,&nbsp;DDRRam</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_267_456_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_267_456_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_306_370_Open_Image onclick="this.style.display='none'; Codehighlighter1_306_370_Open_Text.style.display='none'; Codehighlighter1_306_370_Closed_Image.style.display='inline'; Codehighlighter1_306_370_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_306_370_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_306_370_Closed_Text.style.display='none'; Codehighlighter1_306_370_Open_Image.style.display='inline'; Codehighlighter1_306_370_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;PentiumProcessor&nbsp;createA()&nbsp;</span><span id=Codehighlighter1_306_370_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_306_370_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;一切特化且可在这里实现。</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;PentiumProcessor();<br><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_400_454_Open_Image onclick="this.style.display='none'; Codehighlighter1_400_454_Open_Text.style.display='none'; Codehighlighter1_400_454_Closed_Image.style.display='inline'; Codehighlighter1_400_454_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_400_454_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_400_454_Closed_Text.style.display='none'; Codehighlighter1_400_454_Open_Image.style.display='inline'; Codehighlighter1_400_454_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;DDRRam&nbsp;createB()&nbsp;</span><span id=Codehighlighter1_400_454_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_400_454_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;一切特化且可在这里实现。</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;DDRRam();<br><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;使用</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">AbstractFactory</span><span style="COLOR: #000000">&lt;?</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;Processor,&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;Ram</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;factory&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;IntelFactory();<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>Processor&nbsp;processor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;factory.createA();<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>Ram&nbsp;ram&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;factory.createB();</span></div>
<p>以上代码并没有运用不必要的TypeToken，而且也没有实例化时特化的问题，但是仍然没有解决Abstract Factory的量的问题。可以看出，这段代码非常的简洁，我觉得这段代码真正突出了Generics的优点：<strong>泛化类型</strong>，而没有做不应该做的过多的事情（比如泛化本来应该是特化的东西）。</p>
<p>注意Java的Generics语法是可以使用wildcard的（?），这是.NET所没有的。wildcard的特点之一就是能够在变量声明中使用，这是很重要的一大特色。</p><img src ="http://www.cnblogs.com/cavingdeep/aggbug/357434.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>新兴XML处理方法VTD-XML介绍</title><link>http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Wed, 15 Mar 2006 03:49:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/350456.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html#Feedback</comments><slash:comments>26</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/350456.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/350456.html</trackback:ping><description><![CDATA[摘要: 比DOM与SAX更快，比DOM与SAX更好用，这就是VTD-XML，待我慢慢道来……&nbsp;&nbsp;<a href='http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html'>阅读全文</a><img src ="http://www.cnblogs.com/cavingdeep/aggbug/350456.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47960/" target="_blank">火狐3.5版被指推出太匆忙：存在50多个漏洞</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Performance Tips I</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/12/16/298448.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Fri, 16 Dec 2005 05:39:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/12/16/298448.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/298448.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/12/16/298448.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/298448.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/298448.html</trackback:ping><description><![CDATA[摘要: 假如所有的人都很在意高性能代码的话，那么我的这篇Blog就没有意义了。我希望能够给出一些有意义的性能提示，这些是我们日常编码工作中总会碰到的，所以对这些小tips漠不关心只会日益加深对你代码的伤害，而且做Review的时候也会很不体面，老实说，一个人写的代码确切地反映了这个人的能力与个性，对于经常看不同代码的我们来说，这并不是胡说的，我们有确切的体会。首先值得一提的是，如果你的程序有性能问题，请不&nbsp;&nbsp;<a href='http://www.cnblogs.com/cavingdeep/archive/2005/12/16/298448.html'>阅读全文</a><img src ="http://www.cnblogs.com/cavingdeep/aggbug/298448.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47959/" target="_blank">Google对手机搜索进行优化升级</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>DCG 2.0.72 (Beta1) 发布了</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/23/282561.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Wed, 23 Nov 2005 03:03:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/23/282561.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/282561.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/23/282561.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/282561.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/282561.html</trackback:ping><description><![CDATA[<P>终于跨入了Beta版本了，这时的DCG 2.0可是绝对不容忽视的哦。 </P>
<P>我这里简单描述一下现有功能，有兴趣的朋友请自行下载。</P>
<OL>
<LI>使用简便切容易扩展的模板引擎。</LI>
<LI>提供基于ASP语法的模板语言，简单易上手。</LI>
<LI>扩展ASP的DTL（Dynamic Template Language）模板语言。现在写模板终于变得简单易维护了！</LI>
<LI>内置Dcg对象，提供模板自身信息。</LI>
<LI>完美自控资源清理，不会在您的目标系统上留下任何痕迹。</LI>
<LI>安全的动态模板执行，运行DCG动态模板不会危及到您的系统，您尽可放心运行从第三方获得的DCG动态模板，因为DCG模板的运行权限要比Internet程序还要低。</LI>
<LI>调试支持，开启调试后您将可以获得详细到行与列的错误提示信息。</LI>
<LI>最后但却很重要的一项，DCG很快并且内存占用很优化，您尽可以放心的在你的程序中使用大量DCG动态模板。</LI></OL>
<P>我会在今后的一些时日中仔细描述每一个功能以及使用，同时我会告诉你它们能给你带来什么样的价值。</P>
<P><A href="http://dcg.tigris.org/" target=_blank>http://dcg.tigris.org</A> </P><img src ="http://www.cnblogs.com/cavingdeep/aggbug/282561.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47958/" target="_blank">风声又起 Windows 7 RTM版7月13日完成</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>NUnit发布2.2.3兼容.NET 2.0 RTM</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/17/278256.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Thu, 17 Nov 2005 00:50:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/17/278256.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/278256.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/17/278256.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/278256.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/278256.html</trackback:ping><description><![CDATA[<P>比较欣慰的消息，NUnit不会因为VS 2005的存在而受到威胁，现NUnit已发布了这个兼容VS 2005与.NET 2.0 RTM的iteration版本。</P>
<P>有需要的朋友们赶快自取吧。</P><A href="http://sourceforge.net/forum/forum.php?forum_id=511248" target=_blank>http://sourceforge.net/forum/forum.php?forum_id=511248</A> 
<P></P><img src ="http://www.cnblogs.com/cavingdeep/aggbug/278256.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47957/" target="_blank">乔布斯和埃利森</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>如果你想拥有一个可嵌入式模板引擎……</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/16/277871.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Wed, 16 Nov 2005 08:49:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/16/277871.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/277871.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/16/277871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/277871.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/277871.html</trackback:ping><description><![CDATA[<P>今天我发布了DCG 2.0的部分文档，其中包括DTL参考，有兴趣的朋友可以去看下。如果你需要在程序中使用模板的话，我也建议你去看下。不多说了，下面是链接。如果你还不知道DCG是什么，可以先看看我以前发布的Blog。</P>
<P><A href="http://cavingdeep.cnblogs.com/archive/2005/11/12/274618.html" target=_blank>《改进ASP语法打造更高效的模板语言》</A> </P>
<P><A href="http://cavingdeep.cnblogs.com/archive/2005/11/12/274802.html" target=_blank>《改进ASP语法打造更高效的模板语言II》</A> </P>
<P>项目首页 <BR><A href="http://dcg.tigris.org/" target=_blank>http://dcg.tigris.org</A> </P>
<P>文档页 <BR><A href="http://dcg.tigris.org/doc.html" target=_blank>http://dcg.tigris.org/doc.html</A> </P>
<P>另外模板引擎的使用帮助也已经被写在了SDK帮助中，你可以通过获取最新的源代码获得，获取后用NAnt编译生成文档。如果在使用上有什么问题的话请通过此Blog与我联系。</P><img src ="http://www.cnblogs.com/cavingdeep/aggbug/277871.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47956/" target="_blank">Xbox Live将投放Silverlight广告</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>改进ASP语法打造更高效的模板语言II</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274802.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Sat, 12 Nov 2005 09:29:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274802.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/274802.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/274802.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/274802.html</trackback:ping><description><![CDATA[<P>在<A href="http://cavingdeep.cnblogs.com/archive/2005/11/12/274618.html" target=_blank>《改进ASP语法打造更高效的模板语言》</A>一篇中，我介绍了DTL作为ASP扩展语法的模板语言所带来的优势之一：静态标签。在这一篇中，我将带你领略DTL的又一强势：模板标签。 </P>
<P>让我们来看一个例子，假如我想输出以下内容：</P>
<P></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_26_42_Open_Image onclick="this.style.display='none'; Codehighlighter1_26_42_Open_Text.style.display='none'; Codehighlighter1_26_42_Closed_Image.style.display='inline'; Codehighlighter1_26_42_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_26_42_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_42_Closed_Text.style.display='none'; Codehighlighter1_26_42_Open_Image.style.display='inline'; Codehighlighter1_26_42_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;numbers&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;</SPAN><SPAN id=Codehighlighter1_26_42_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_26_42_Open_Text><SPAN style="COLOR: #000000">{&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">4</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">;</SPAN> </DIV>
<P>注意空格哦！这里的动态部分就是从1到5的这部分。模板要怎样写呢？可以这样：</P>
<P></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_26_168_Open_Image onclick="this.style.display='none'; Codehighlighter1_26_168_Open_Text.style.display='none'; Codehighlighter1_26_168_Closed_Image.style.display='inline'; Codehighlighter1_26_168_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_26_168_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_168_Closed_Text.style.display='none'; Codehighlighter1_26_168_Open_Image.style.display='inline'; Codehighlighter1_26_168_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;numbers&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;</SPAN><SPAN id=Codehighlighter1_26_168_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_26_168_Open_Text><SPAN style="COLOR: #000000">{&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_60_163_Open_Image onclick="this.style.display='none'; Codehighlighter1_60_163_Open_Text.style.display='none'; Codehighlighter1_60_163_Closed_Image.style.display='inline'; Codehighlighter1_60_163_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_60_163_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_60_163_Closed_Text.style.display='none'; Codehighlighter1_60_163_Open_Image.style.display='inline'; Codehighlighter1_60_163_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_60_163_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_60_163_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG id=Codehighlighter1_76_116_Open_Image onclick="this.style.display='none'; Codehighlighter1_76_116_Open_Text.style.display='none'; Codehighlighter1_76_116_Closed_Image.style.display='inline'; Codehighlighter1_76_116_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_76_116_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_76_116_Closed_Text.style.display='none'; Codehighlighter1_76_116_Open_Image.style.display='inline'; Codehighlighter1_76_116_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_76_116_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_76_116_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%=</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">,&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_123_161_Open_Image onclick="this.style.display='none'; Codehighlighter1_123_161_Open_Text.style.display='none'; Codehighlighter1_123_161_Closed_Image.style.display='inline'; Codehighlighter1_123_161_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_123_161_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_123_161_Closed_Text.style.display='none'; Codehighlighter1_123_161_Open_Image.style.display='inline'; Codehighlighter1_123_161_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_123_161_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_123_161_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%=</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">;</SPAN> </DIV>
<P></P>嗯，可以是可以，不过我总觉得这样的可读性较差，如果可以在动态模板中方便的使用动态模板该多好啊，那样的话我就可以简单的这样写了： 
<P></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_26_44_Open_Image onclick="this.style.display='none'; Codehighlighter1_26_44_Open_Text.style.display='none'; Codehighlighter1_26_44_Closed_Image.style.display='inline'; Codehighlighter1_26_44_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_26_44_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_44_Closed_Text.style.display='none'; Codehighlighter1_26_44_Open_Image.style.display='inline'; Codehighlighter1_26_44_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;numbers&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;</SPAN><SPAN id=Codehighlighter1_26_44_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_26_44_Open_Text><SPAN style="COLOR: #000000">{&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%=</SPAN><SPAN style="COLOR: #000000">template1</SPAN><SPAN style="COLOR: #000000">=%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">#&nbsp;template1 <BR><IMG id=Codehighlighter1_91_194_Open_Image onclick="this.style.display='none'; Codehighlighter1_91_194_Open_Text.style.display='none'; Codehighlighter1_91_194_Closed_Image.style.display='inline'; Codehighlighter1_91_194_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_91_194_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_91_194_Closed_Text.style.display='none'; Codehighlighter1_91_194_Open_Image.style.display='inline'; Codehighlighter1_91_194_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_91_194_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_91_194_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG id=Codehighlighter1_107_147_Open_Image onclick="this.style.display='none'; Codehighlighter1_107_147_Open_Text.style.display='none'; Codehighlighter1_107_147_Closed_Image.style.display='inline'; Codehighlighter1_107_147_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_107_147_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_107_147_Closed_Text.style.display='none'; Codehighlighter1_107_147_Open_Image.style.display='inline'; Codehighlighter1_107_147_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_107_147_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_107_147_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%=</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">,&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_154_192_Open_Image onclick="this.style.display='none'; Codehighlighter1_154_192_Open_Text.style.display='none'; Codehighlighter1_154_192_Closed_Image.style.display='inline'; Codehighlighter1_154_192_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_154_192_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_154_192_Closed_Text.style.display='none'; Codehighlighter1_154_192_Open_Image.style.display='inline'; Codehighlighter1_154_192_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_154_192_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_154_192_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%=</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>#</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN> </DIV>
<P>呵呵，不错，就是这个样子，这就是我想要的。嗯，&lt;%# templateName #%&gt;就是所谓的模板标签，它定义了一个动态模板，&lt;%=templateName=%&gt;就是模板引用，将被引用的模板结果输出到引用位置上。</P>
<P>这下清晰多了，而且模板可以被多个地方引用，达到一定程度上的可重用性。这套机制酷似XSLT中的template标签，不过没有模板参数等的定义。也许你会问：&#8220;那我可以传参数给模板标签吗？&#8221;可以，不过准确的说不是你手动传，是自动传的。换句话说，模板引用是一个Closure，模板标签中的内容在运行时会自动获得所有模板引用当前的上下文。比如如下示例：</P>
<P></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">#&nbsp;t1 <BR><IMG id=Codehighlighter1_19_53_Open_Image onclick="this.style.display='none'; Codehighlighter1_19_53_Open_Text.style.display='none'; Codehighlighter1_19_53_Closed_Image.style.display='inline'; Codehighlighter1_19_53_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_19_53_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_19_53_Closed_Text.style.display='none'; Codehighlighter1_19_53_Open_Image.style.display='inline'; Codehighlighter1_19_53_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(var)&nbsp;</SPAN><SPAN id=Codehighlighter1_19_53_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_19_53_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OK <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_60_98_Open_Image onclick="this.style.display='none'; Codehighlighter1_60_98_Open_Text.style.display='none'; Codehighlighter1_60_98_Closed_Image.style.display='inline'; Codehighlighter1_60_98_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_60_98_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_60_98_Closed_Text.style.display='none'; Codehighlighter1_60_98_Open_Image.style.display='inline'; Codehighlighter1_60_98_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_60_98_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_60_98_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oh,&nbsp;no <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>#</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">bool</SPAN><SPAN style="COLOR: #000000">&nbsp;var&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;First&nbsp;time&nbsp;call</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">s&nbsp;result&nbsp;is&nbsp;&lt;%=t1=%&gt;.</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;var&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;Second&nbsp;time&nbsp;call</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">s&nbsp;result&nbsp;is&nbsp;&lt;%=t1=%&gt;.</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>输出为： <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>First&nbsp;time&nbsp;call</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">s&nbsp;result&nbsp;is&nbsp;OK.</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">Second&nbsp;time&nbsp;call</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">s&nbsp;result&nbsp;is&nbsp;oh,&nbsp;no.</SPAN> </DIV>
<P>好了，这篇的内容就介绍完了，不知道我所描述的这两大DTL语法有没有引起你的足够兴趣，再次说明一下，如果你已经感兴趣了的话，可以自己下载试一下哦。在<A href="http://cavingdeep.cnblogs.com/archive/2005/11/12/274618.html" target=_blank>《改进ASP语法打造更高效的模板语言》</A>一篇中有相关链接。 </P>截止今日，又有一些小bug被fix掉了，所以如果你想让你的体验更愉快的话，请随时获取最新的源代码自行编译。<img src ="http://www.cnblogs.com/cavingdeep/aggbug/274802.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47951/" target="_blank">Debian无视GNU创始人警告 接受Mono</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>改进ASP语法打造更高效的模板语言</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274618.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Sat, 12 Nov 2005 03:30:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274618.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/274618.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/12/274618.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/274618.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/274618.html</trackback:ping><description><![CDATA[<P>写过动态模板（包括ASP、JSP等）的人都知道一个动态模板有两个基础部分，静态部分和动态部分。静态部分就是我们想输出的静态内容，这部分内容是永远都不会变的，动态部分含有可执行代码，会在运行时得到不同的输出。比如如下ASP代码会根据人名的不同输出不同的内容：</P>
<P></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #000000">Hello&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%=</SPAN><SPAN style="COLOR: #000000">employee.Name</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">.</SPAN> </DIV>
<P>如何将静态与动态这两部分很好的混合在一个模板中一直是动态模板的易用性关键，比如如果我想输出从1到5，以逗号分隔这样的文字时我可以用以下写法：</P>
<P></P>
<P></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;length&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_59_135_Open_Image onclick="this.style.display='none'; Codehighlighter1_59_135_Open_Text.style.display='none'; Codehighlighter1_59_135_Closed_Image.style.display='inline'; Codehighlighter1_59_135_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_59_135_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_59_135_Closed_Text.style.display='none'; Codehighlighter1_59_135_Open_Image.style.display='inline'; Codehighlighter1_59_135_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;length;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_59_135_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_59_135_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG id=Codehighlighter1_80_104_Open_Image onclick="this.style.display='none'; Codehighlighter1_80_104_Open_Text.style.display='none'; Codehighlighter1_80_104_Closed_Image.style.display='inline'; Codehighlighter1_80_104_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_80_104_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_104_Closed_Text.style.display='none'; Codehighlighter1_80_104_Open_Image.style.display='inline'; Codehighlighter1_80_104_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;length)&nbsp;</SPAN><SPAN id=Codehighlighter1_80_104_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_80_104_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;&lt;%=</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_111_133_Open_Image onclick="this.style.display='none'; Codehighlighter1_111_133_Open_Text.style.display='none'; Codehighlighter1_111_133_Closed_Image.style.display='inline'; Codehighlighter1_111_133_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_111_133_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_111_133_Closed_Text.style.display='none'; Codehighlighter1_111_133_Open_Image.style.display='inline'; Codehighlighter1_111_133_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_111_133_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_111_133_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;&lt;%=</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">%&gt;&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>输出为:&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">4</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN> </DIV>
<P>我们可以通过指定length变量来调节到底输出多少个数字，这就是动态模板的优势：含有动态代码。在这个例子中，我们将动态部分作为阅读主体，将静态部分作为辅助，这样可以写出来的模板才是可读的。但问题是以上ASP语法对初看ASP的人来说实在不习惯，因为ASP语法中是不可以在动态代码中嵌套静态文字的，所以我们才需要调整动态标签的位置，使整体看起来像是动态部分为主体，静态部分为辅助一样。</P>
<P>实际情况中，有时以静态部分为主看的要更清晰些，有时以动态部分为主看的更清晰些，没有绝对的情况。在这个比较简单的例子中ASP语法的可读性还不算太差，但是如果换个稍微复杂点的你就会觉得ASP语法写出来的模板几乎无法阅读。示例如下：</P>
<P></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #000000">根据不同情况，我要输出： <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>情况1 <BR><IMG id=Codehighlighter1_29_74_Open_Image onclick="this.style.display='none'; Codehighlighter1_29_74_Open_Text.style.display='none'; Codehighlighter1_29_74_Closed_Image.style.display='inline'; Codehighlighter1_29_74_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_29_74_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_29_74_Closed_Text.style.display='none'; Codehighlighter1_29_74_Open_Image.style.display='inline'; Codehighlighter1_29_74_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo()&nbsp;</SPAN><SPAN id=Codehighlighter1_29_74_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_29_74_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;name1; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Do&nbsp;the&nbsp;right&nbsp;job<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>情况2 <BR><IMG id=Codehighlighter1_92_124_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_124_Open_Text.style.display='none'; Codehighlighter1_92_124_Closed_Image.style.display='inline'; Codehighlighter1_92_124_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_92_124_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_124_Closed_Text.style.display='none'; Codehighlighter1_92_124_Open_Image.style.display='inline'; Codehighlighter1_92_124_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo()&nbsp;</SPAN><SPAN id=Codehighlighter1_92_124_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_92_124_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Erase&nbsp;your&nbsp;hard&nbsp;disk<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>ASP语法的动态模板 <BR><IMG id=Codehighlighter1_149_283_Open_Image onclick="this.style.display='none'; Codehighlighter1_149_283_Open_Text.style.display='none'; Codehighlighter1_149_283_Closed_Image.style.display='inline'; Codehighlighter1_149_283_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_149_283_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_149_283_Closed_Text.style.display='none'; Codehighlighter1_149_283_Open_Image.style.display='inline'; Codehighlighter1_149_283_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo()&nbsp;</SPAN><SPAN id=Codehighlighter1_149_283_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_149_283_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_171_226_Open_Image onclick="this.style.display='none'; Codehighlighter1_171_226_Open_Text.style.display='none'; Codehighlighter1_171_226_Closed_Image.style.display='inline'; Codehighlighter1_171_226_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_171_226_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_226_Closed_Text.style.display='none'; Codehighlighter1_171_226_Open_Image.style.display='inline'; Codehighlighter1_171_226_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(case1)&nbsp;</SPAN><SPAN id=Codehighlighter1_171_226_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_171_226_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;name1; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Do&nbsp;the&nbsp;right&nbsp;job<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15>&lt;%</SPAN><SPAN style="COLOR: #008000"> <BR><IMG id=Codehighlighter1_233_275_Open_Image onclick="this.style.display='none'; Codehighlighter1_233_275_Open_Text.style.display='none'; Codehighlighter1_233_275_Closed_Image.style.display='inline'; Codehighlighter1_233_275_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_233_275_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_233_275_Closed_Text.style.display='none'; Codehighlighter1_233_275_Open_Image.style.display='inline'; Codehighlighter1_233_275_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_233_275_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_233_275_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Erase&nbsp;your&nbsp;hard&nbsp;disk<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15>&lt;%</SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P>就像上面例子中你所看到的，ASP语法的可读性很差，尤其当我有一个动态部分中嵌套静态部分，而被嵌套的静态部分中又嵌套有动态部分这样的情况下尤为突出。那么能不能有一种语法可以让我做到静态与动态之间的嵌套呢？回答是肯定的！</P>
<P>DCG (Dynamic Code Generator) 是我在去年开始的一个个人项目，简单地说，它就是一个提供了动态模板引擎的dll。1.x版本采用了ASP语法作为模板语言，并且提供了一些相关使用工具。在2.0版本中，我的目标是更强更易扩展的引擎与更易使用与阅读的模板语言。现很荣幸地告诉大家，我于昨天发布了DCG 2.0的Alpha版本，实现了我的初期目标，更强更易扩展的引擎，更易使用的模板语言：DTL。</P>
<P>DTL是基于ASP语法的一个语法扩展，完全兼容ASP。刚刚我们谈到，是否可以在静态于动态部分之前嵌套的问题，现在让我们来看看使用DTL是如何写上面那个示例的。</P>
<P></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #000000">DTL语法的动态模板 <BR><IMG id=Codehighlighter1_22_191_Open_Image onclick="this.style.display='none'; Codehighlighter1_22_191_Open_Text.style.display='none'; Codehighlighter1_22_191_Closed_Image.style.display='inline'; Codehighlighter1_22_191_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_22_191_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_22_191_Closed_Text.style.display='none'; Codehighlighter1_22_191_Open_Image.style.display='inline'; Codehighlighter1_22_191_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo()&nbsp;</SPAN><SPAN id=Codehighlighter1_22_191_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_22_191_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_44_118_Open_Image onclick="this.style.display='none'; Codehighlighter1_44_118_Open_Text.style.display='none'; Codehighlighter1_44_118_Closed_Image.style.display='inline'; Codehighlighter1_44_118_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_44_118_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_44_118_Closed_Text.style.display='none'; Codehighlighter1_44_118_Open_Image.style.display='inline'; Codehighlighter1_44_118_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(case1)&nbsp;</SPAN><SPAN id=Codehighlighter1_44_118_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_44_118_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;name1; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Do&nbsp;the&nbsp;right&nbsp;job<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_125_183_Open_Image onclick="this.style.display='none'; Codehighlighter1_125_183_Open_Text.style.display='none'; Codehighlighter1_125_183_Closed_Image.style.display='inline'; Codehighlighter1_125_183_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_125_183_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_125_183_Closed_Text.style.display='none'; Codehighlighter1_125_183_Open_Image.style.display='inline'; Codehighlighter1_125_183_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_125_183_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_125_183_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Erase&nbsp;your&nbsp;hard&nbsp;disk<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN style="COLOR: #008000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN> </DIV>
<P>&lt;%! !%&gt;标签是用来在一个动态标签内标明一段静态文字。注意静态内容的每一行开始都是与&lt;%!标签对齐的，当输出时，结果会输出到&lt;%!标签所属的&lt;%标签的位置去。</P>
<P>现在有了静态标签，我们就可以随意的做嵌套了，如：</P>
<P></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_18_171_Open_Image onclick="this.style.display='none'; Codehighlighter1_18_171_Open_Text.style.display='none'; Codehighlighter1_18_171_Closed_Image.style.display='inline'; Codehighlighter1_18_171_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_18_171_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_18_171_Closed_Text.style.display='none'; Codehighlighter1_18_171_Open_Image.style.display='inline'; Codehighlighter1_18_171_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(condition)&nbsp;</SPAN><SPAN id=Codehighlighter1_18_171_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_18_171_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;Content&nbsp;</SPAN><SPAN style="COLOR: #0000ff">is</SPAN><SPAN style="COLOR: #000000">: <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_67_108_Open_Image onclick="this.style.display='none'; Codehighlighter1_67_108_Open_Text.style.display='none'; Codehighlighter1_67_108_Closed_Image.style.display='inline'; Codehighlighter1_67_108_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_67_108_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_108_Closed_Text.style.display='none'; Codehighlighter1_67_108_Open_Image.style.display='inline'; Codehighlighter1_67_108_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(condition2)&nbsp;</SPAN><SPAN id=Codehighlighter1_67_108_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_67_108_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Content1. <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_115_156_Open_Image onclick="this.style.display='none'; Codehighlighter1_115_156_Open_Text.style.display='none'; Codehighlighter1_115_156_Closed_Image.style.display='inline'; Codehighlighter1_115_156_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_115_156_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_115_156_Closed_Text.style.display='none'; Codehighlighter1_115_156_Open_Image.style.display='inline'; Codehighlighter1_115_156_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_115_156_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_115_156_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;%!</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Content2. <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!%&gt;</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN> </DIV>
<P>这可要比等价的ASP写出来的好看多了，最重要的是在编写模板的过程中利用DTL很直观，不会因为ASP语法的限制打断你的思路，从而提高你的效率，减少你的头疼率、压力，保护你的健康！:D</P>
<P><FONT color=#ff0000>DTL还有一项语法增强，不过我会留到在下篇Blog中讲解，敬请关注！</FONT> </P>
<P>如果你对此很感兴趣，想自己试验一下的话那么还等什么，赶快去下载Alpha版本吧，任何反馈都是受欢迎的。^_^</P>
<P>项目首页 <BR><A href="http://dcg.tigris.org/" target=_blank>http://dcg.tigris.org</A> </P>
<P>二进制下载页面 <BR><A href="http://dcg.tigris.org/servlets/ProjectDocumentList" target=_blank>http://dcg.tigris.org/servlets/ProjectDocumentList</A> </P>
<P>源代码获取方式</P>
<P>建议使用TortoiseSVN获取：</P>
<P>Repository src dir <BR>http://dcg.tigris.org/svn/dcg/trunk <BR>用户名 <BR>guest <BR>密码 <BR>guest </P>
<P>目前还没有充分的整理文档，使用请参考单元测试项目中的测试用例，另外请看生成的SDK文档，如果你获取源码编译，可以用NAnt使用项目中的default.build编译，你可能需要在这个文件中手动设置一下编译相关工具的路径。任何使用问题请用此Blog与我联系，任何bug或建议请使用项目首页中的Issue Tracker（可能需要你在Tigris注册，Tigris是一个面向开发人员的开源平台）。</P>
<P>DCG的license为LGPL，请尊重软件，尊重license！</P><img src ="http://www.cnblogs.com/cavingdeep/aggbug/274618.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47951/" target="_blank">Debian无视GNU创始人警告 接受Mono</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>XML的特征以及一些用途</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/08/271463.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Tue, 08 Nov 2005 05:40:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/08/271463.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/271463.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/08/271463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/271463.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/271463.html</trackback:ping><description><![CDATA[<P>XML绝对不仅仅是简单的一堆tag，你可以把它当作以下任何一种事物来看待：</P>
<UL>
<LI>数据载体</LI>
<LI>编程语言</LI>
<LI>文档语言</LI></UL>
<P>以上是一部分XML适用的领域，但绝对不是全部。也许你会问，难道XML是变形金刚吗？怎么可以变成这么多种不同领域的东西来？是，XML就像一个训练有素的军人，用不同的武器武装就可以胜任不同的岗位，管它是陆军、海军还是空军。这是怎么回事呢？我这里所提到的武器，就是X系列的其他技术，如XSLT，XPath等，用它们来武装XML就可以达到胜任多个岗位的能力。请看以下图解：</P>
<P align=center><IMG height=392 alt=XML的组合应用 hspace=5 src="http://www.cnblogs.com/images/cnblogs_com/cavingdeep/xml1.png" width=431> </P>
<P>看到了吧，XML的威力！这里再分别提一下目前这些XML技术的使用案例：</P>
<UL>
<LI>
<P>Ant, NAnt：以XML为语言形式，制作了基于target, task的任务编程语言。这里之所以选择XML而不是重新设计一种语言是为了降低编译器编写的成本。</P></LI>
<LI>
<P>SOAP：用XML为Web Service定制的一套通信协议，目前大多数XML Web Service都在使用。</P></LI>
<LI>
<P>配置文件：目前大多数项目都选择XML作为自己的配置文件格式，可以看作是数据载体的一种。</P></LI>
<LI>
<P>支持XML的数据库：这些数据库可以将XML作为一种特殊的字段类型，可以直接在这个字段中使用XPath、XQuery检索数据，使XML成为了一种类似于数据库的数据载体。</P></LI>
<LI>
<P>DocBook：它定制了多种schema，以XML作为文档载体，然后通过各种其他手段包括DOM、XSLT、XSL-FO等对XML文档进行格式化并最终展现。是一个将XML作为文档语言的案例。</P></LI></UL>
<P>其他案例还有很多，如果你还没有用到XML，那还等什么？难道说你真的不需要它吗？！请再考虑一遍！</P>为什么X系列这样流行呢？因为用它的好处很多，总结起来它有以下几大好处（从成本角度来看）： 
<UL>
<LI>
<P>时间的节省，X系列的所有理论伴有框架、工具等的支持，这些都是现成的，如果我采用XML，那么我立刻就可以拥有这些能力，包括XML的读取、书写，XML的格式验证（XSD），数据、结构的转换（通过XSLT），数据的检索（XPath）等等。如果不采用XML，那么这些我都需要自行实现。</P></LI>
<LI>
<P>研发成本，如果一个方案不采用XML，那么自行实现的技术风险就要比采用XML的大（除非技术实力真的很强），因为XML本身是可以很好的扩展并且是有先例可以借鉴的，但自行实现就没有这些优势了。</P></LI>
<LI>
<P>兼容性与扩展性，如果采用XML，会更方便的兼容第三方的解决方案，目前XML是一项被广泛采纳的标准，大多数组织都会选择在XML的基础上开发其他标准，如工作流的XPDL, Wf-XML，e-Commerce中的RosettaNet等。此外，你还可以通过XSLT在不同的标准间进行转换，能做到什么，就看你的想象力了。如果可以在对第三方的支持上有效快速的兼容、集成，那么无疑是对维护成本的一大笔节省。</P></LI></UL>
<P>最后再提一个XML的强项，也是比较有前途的应用，Mapping！XML结构上的高度灵活性与众多的辅助技术决定了它，也许是最好的mapping选择。我可以自由的在不同的数据源之间做映射，如下图所示：</P>
<P align=center><IMG height=204 alt="Mapping with XML" hspace=5 src="http://www.cnblogs.com/images/cnblogs_com/cavingdeep/xml2.png" width=323 align=baseline> </P><img src ="http://www.cnblogs.com/cavingdeep/aggbug/271463.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47950/" target="_blank">iPhone 3GS首发日创AT&T多项纪录</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Release of DbHelper 1.2.1</title><link>http://www.cnblogs.com/cavingdeep/archive/2005/11/03/268026.html</link><dc:creator>Cavingdeep</dc:creator><author>Cavingdeep</author><pubDate>Thu, 03 Nov 2005 07:42:00 GMT</pubDate><guid>http://www.cnblogs.com/cavingdeep/archive/2005/11/03/268026.html</guid><wfw:comment>http://www.cnblogs.com/cavingdeep/comments/268026.html</wfw:comment><comments>http://www.cnblogs.com/cavingdeep/archive/2005/11/03/268026.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/cavingdeep/comments/commentRss/268026.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cavingdeep/services/trackbacks/268026.html</trackback:ping><description><![CDATA[



<p>DbHelper增加了两个Build方法分别构建IDbCommand与IDataParameter，同时增加了接受IDbCommand的接
口，这样做是为了在需要重复执行某个Command时不需要每次都重新构建Command浪费效率，现在可以用Build方法先构建出Command对
象，然后在循环中执行这个command，如下示例。</p>
<p></p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><span style="color: rgb(0, 128, 128);">&nbsp;1</span><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11"><span style="color: rgb(0, 0, 0);">IDbHelper&nbsp;helper&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;SqliteHelper(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.connection); <br></span><span style="color: rgb(0, 128, 128);">&nbsp;2</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11"> <br></span><span style="color: rgb(0, 128, 128);">&nbsp;3</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11">IDbCommand&nbsp;insertCommand&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;helper.BuildCommand( <br></span><span style="color: rgb(0, 128, 128);">&nbsp;4</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">INSERT&nbsp;INTO&nbsp;Test&nbsp;VALUES(NULL,&nbsp;@num,&nbsp;@r_date,&nbsp;@data)</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br></span><span style="color: rgb(0, 128, 128);">&nbsp;5</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,&nbsp;DateTime.Now,&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">]); <br></span><span style="color: rgb(0, 128, 128);">&nbsp;6</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11"> <br></span><span style="color: rgb(0, 128, 128);">&nbsp;7</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11">SQLiteConnection&nbsp;con&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;SQLiteConnection(); <br></span><span style="color: rgb(0, 128, 128);">&nbsp;8</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11">con.ConnectionString&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.connection.ConnectionString; <br></span><span style="color: rgb(0, 128, 128);">&nbsp;9</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11"> <br></span><span style="color: rgb(0, 128, 128);">10</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11">con.Open(); <br></span><span style="color: rgb(0, 128, 128);">11</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11"> <br></span><span style="color: rgb(0, 128, 128);">12</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11">IDbTransaction&nbsp;transaction&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;con.BeginTransaction( <br></span><span style="color: rgb(0, 128, 128);">13</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11">&nbsp;&nbsp;&nbsp;IsolationLevel.ReadUncommitted); <br></span><span style="color: rgb(0, 128, 128);">14</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11">insertCommand.Transaction&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;transaction; <br></span><span style="color: rgb(0, 128, 128);">15</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11"> <br></span><span style="color: rgb(0, 128, 128);">16</span><span style="color: rgb(0, 0, 0);"><img id="Codehighlighter1_447_585_Open_Image" onclick="this.style.display='none'; Codehighlighter1_447_585_Open_Text.style.display='none'; Codehighlighter1_447_585_Closed_Image.style.display='inline'; Codehighlighter1_447_585_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"><img id="Codehighlighter1_447_585_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_447_585_Closed_Text.style.display='none'; Codehighlighter1_447_585_Open_Image.style.display='inline'; Codehighlighter1_447_585_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11"></span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span id="Codehighlighter1_447_585_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif" height="20" width="15"></span><span id="Codehighlighter1_447_585_Open_Text"><span style="color: rgb(0, 0, 0);">{ <br></span><span style="color: rgb(0, 128, 128);">17</span><span style="color: rgb(0, 0, 0);"><img id="Codehighlighter1_482_558_Open_Image" onclick="this.style.display='none'; Codehighlighter1_482_558_Open_Text.style.display='none'; Codehighlighter1_482_558_Closed_Image.style.display='inline'; Codehighlighter1_482_558_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" height="16" width="11"><img id="Codehighlighter1_482_558_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_482_558_Closed_Text.style.display='none'; Codehighlighter1_482_558_Open_Image.style.display='inline'; Codehighlighter1_482_558_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" height="16" width="11">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">;&nbsp;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span id="Codehighlighter1_482_558_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif" height="20" width="15"></span><span id="Codehighlighter1_482_558_Open_Text"><span style="color: rgb(0, 0, 0);">{ <br></span><span style="color: rgb(0, 128, 128);">18</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helper.ExecuteCommand(insertCommand,&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,&nbsp;DateTime.Now,&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">); <br></span><span style="color: rgb(0, 128, 128);">19</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" height="16" width="11">&nbsp;&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"> <br></span><span style="color: rgb(0, 128, 128);">20</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11">&nbsp;&nbsp;&nbsp;transaction.Commit(); <br></span><span style="color: rgb(0, 128, 128);">21</span><span style="color: rgb(0, 0, 0);"><img id="Codehighlighter1_593_622_Open_Image" onclick="this.style.display='none'; Codehighlighter1_593_622_Open_Text.style.display='none'; Codehighlighter1_593_622_Closed_Image.style.display='inline'; Codehighlighter1_593_622_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"><img id="Codehighlighter1_593_622_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_593_622_Closed_Text.style.display='none'; Codehighlighter1_593_622_Open_Image.style.display='inline'; Codehighlighter1_593_622_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11">}</span></span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span id="Codehighlighter1_593_622_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif" height="20" width="15"></span><span id="Codehighlighter1_593_622_Open_Text"><span style="color: rgb(0, 0, 0);">{ <br></span><span style="color: rgb(0, 128, 128);">22</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11">&nbsp;&nbsp;&nbsp;transaction.Rollback(); <br></span><span style="color: rgb(0, 128, 128);">23</span><span style="color: rgb(0, 0, 0);"><img id="Codehighlighter1_632_650_Open_Image" onclick="this.style.display='none'; Codehighlighter1_632_650_Open_Text.style.display='none'; Codehighlighter1_632_650_Closed_Image.style.display='inline'; Codehighlighter1_632_650_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"><img id="Codehighlighter1_632_650_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_632_650_Closed_Text.style.display='none'; Codehighlighter1_632_650_Open_Image.style.display='inline'; Codehighlighter1_632_650_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11">}</span></span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">finally</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span id="Codehighlighter1_632_650_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cnblogs.com/Images/dot.gif" height="20" width="15"></span><span id="Codehighlighter1_632_650_Open_Text"><span style="color: rgb(0, 0, 0);">{ <br></span><span style="color: rgb(0, 128, 128);">24</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11">&nbsp;&nbsp;&nbsp;con.Close(); <br></span><span style="color: rgb(0, 128, 128);">25</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" height="16" width="11">}</span></span><span style="color: rgb(0, 0, 0);"> <br></span><span style="color: rgb(0, 128, 128);">26</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" height="16" width="11"></span> </div>
<p>关于DbHelper，请参看：</p>
<p><a href="/category/37490.html" target="_blank">http://cavingdeep.cnblogs.com/category/37490.html</a> </p>
<p>下载及Announcements</p>
<p><font color="#800080"><a href="http://dbhelper.tigris.org/" target="_blank">http://dbhelper.tigris.org</a></font></p><img src ="http://www.cnblogs.com/cavingdeep/aggbug/268026.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47949/" target="_blank">Silverlight开发大赛奖金高达10000美元</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>