<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_用代码编织自己的艺术人生</title><subtitle type="text">软件开发不仅是一个技术问题，更是一个心理学的问题!</subtitle><id>http://feed.cnblogs.com/blog/u/8867/rss</id><updated>2011-09-01T11:09:22Z</updated><author><name>浪子</name><uri>http://www.cnblogs.com/walkingboy/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/walkingboy/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/8867/rss"/><entry><id>http://www.cnblogs.com/walkingboy/archive/2010/08/11/linq-to-reflection.html</id><title type="text">LINQ TO Reflection（反射）</title><summary type="text">我们平时开发中不可避免，或者说，经常性的使用反射。但是却没有一个合适的类库帮助我们更好的利用反射。从早期的FastInvoker，到老赵的 fastreflectionlib ，无一不是在强调Fast。这是因为反射的性能损耗比较厉害，所以大家都集中精力解决性能的问题，但是在易用性方面却鲜有改进。今天我为大家带来一个即兼顾性能又具有良好的使用体验的反射类库.</summary><published>2010-08-10T17:08:00Z</published><updated>2010-08-10T17:08:00Z</updated><author><name>浪子</name><uri>http://www.cnblogs.com/walkingboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/walkingboy/archive/2010/08/11/linq-to-reflection.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/walkingboy/archive/2010/08/11/linq-to-reflection.html"/><content type="html">&lt;p&gt;&lt;strong&gt;引言&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;我们平时开发中不可避免，或者说，经常性的使用反射。但是却没有一个合适的类库帮助我们更好的利用反射。从早期的FastInvoker，到老赵的 &lt;a href="http://fastreflectionlib.codeplex.com/" target="_blank"&gt;fastreflectionlib&lt;/a&gt; ，无一不是在强调Fast。这是因为反射的性能损耗比较厉害，所以大家都集中精力解决性能的问题，但是在易用性方面却鲜有改进。今天我为大家带来一个即兼顾性能又具有良好的使用体验的反射类库.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;.Metadata()&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;此类库以LINQ TO Object为基础，可以通过调用.Metadata()方法获取对应Type的完整Metadata信息。此信息会被进行缓存，并且使用fastreflectionlib的核心Lambda代码，利用DynamicMethod代替直接的反射执行。&lt;/p&gt;&lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; Metadata Metadata(&lt;span &gt;this&lt;/span&gt; &lt;span &gt;object&lt;/span&gt; instance)&lt;br /&gt;        {&lt;br /&gt;            &lt;span &gt;return&lt;/span&gt; MetadataCache.Create(instance);&lt;br /&gt;        }&lt;/pre&gt;&#xD;
&lt;p&gt;先定义一个MockObject&lt;/p&gt;&lt;pre &gt;&lt;span &gt;class&lt;/span&gt; MockAttribute : Attribute&lt;br /&gt;        {&lt;br /&gt;            &lt;span &gt;public&lt;/span&gt; MockAttribute(&lt;span &gt;string&lt;/span&gt; name)&lt;br /&gt;            {&lt;br /&gt;                &lt;span &gt;this&lt;/span&gt;.Name = name;&lt;br /&gt;            }&lt;br /&gt;            &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; Name&lt;br /&gt;            {&lt;br /&gt;                get;set;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span &gt;class&lt;/span&gt; MockObject&lt;br /&gt;        {&lt;br /&gt;            &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; Country = &lt;span &gt;"China"&lt;/span&gt;;&lt;br /&gt;            &lt;br /&gt;            [Mock(&lt;span &gt;"this is the name"&lt;/span&gt;)]&lt;br /&gt;            &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; Name&lt;br /&gt;            {&lt;br /&gt;                get;set;&lt;br /&gt;            }&lt;br /&gt;            &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; Blog&lt;br /&gt;            {&lt;br /&gt;                get;set;&lt;br /&gt;            }&lt;br /&gt;            [Mock(&lt;span &gt;"this is the location"&lt;/span&gt;)]&lt;br /&gt;            &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; Location&lt;br /&gt;            {&lt;br /&gt;                get;set;&lt;br /&gt;            }&lt;br /&gt;            &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; SayHello(&lt;span &gt;string&lt;/span&gt; name)&lt;br /&gt;            {&lt;br /&gt;                &lt;span &gt;return&lt;/span&gt; &lt;span &gt;"Hi,"&lt;/span&gt; + name;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.如何获取一个属性，并进行取值、赋值？&lt;/p&gt;&lt;pre &gt;&lt;span &gt;using&lt;/span&gt; Sparrow.Reflection;&lt;br /&gt;        [TestMethod]&lt;br /&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; set_property_value()&lt;br /&gt;        {&lt;br /&gt;            var obj = &lt;span &gt;new&lt;/span&gt; MockObject { Name = &lt;span &gt;"dayi"&lt;/span&gt;, Blog = &lt;span &gt;"http://walkingboy.cnblogs.com"&lt;/span&gt;, Location = &lt;span &gt;"XiaMen"&lt;/span&gt; };&lt;br /&gt;            var property = obj.Metadata().Properties.Where(i =&amp;gt; i.Name == &lt;span &gt;"Location"&lt;/span&gt;).FirstOrDefault();&lt;br /&gt;            var changedLocation = &lt;span &gt;"Xiamen,China"&lt;/span&gt;;&lt;br /&gt;            &lt;span &gt;//get value&lt;/span&gt;&#xD;
            &lt;span &gt;//var value = property.GetValue(obj);&lt;/span&gt;&#xD;
            property.SetValue(obj, changedLocation);&#xD;
            Assert.AreEqual(changedLocation, obj.Location);&#xD;
        }&lt;/pre&gt;&#xD;
&lt;p&gt;2.如果获取一个字段的值？&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;using&lt;/span&gt; Sparrow.Reflection;&lt;br /&gt;        [TestMethod]&lt;br /&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; get_field_value()&lt;br /&gt;        {&lt;br /&gt;            var obj = &lt;span &gt;new&lt;/span&gt; MockObject();&lt;br /&gt;&lt;br /&gt;            var field = obj.Metadata().Fields.Where(i =&amp;gt; i.Name == &lt;span &gt;"Country"&lt;/span&gt;).FirstOrDefault();&lt;br /&gt;&lt;br /&gt;            Assert.AreEqual(&lt;span &gt;"China"&lt;/span&gt;, field.GetValue(obj));&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;3.如何获取一个自定义CustomAttribute？&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;using&lt;/span&gt; Sparrow.Reflection;&lt;br /&gt;        [TestMethod]&lt;br /&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; get_custom_attribute_data()&lt;br /&gt;        {&lt;br /&gt;            var obj = &lt;span &gt;new&lt;/span&gt; MockObject { Name = &lt;span &gt;"dayi"&lt;/span&gt;, Blog = &lt;span &gt;"http://walkingboy.cnblogs.com"&lt;/span&gt;, Location = &lt;span &gt;"XiaMen"&lt;/span&gt; };&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            var attribute = obj.Metadata().Properties&lt;br /&gt;                .Where(i =&amp;gt; i.Name == &lt;span &gt;"Name"&lt;/span&gt;)&lt;br /&gt;                .SelectMany(i =&amp;gt; i.Attributes)&lt;br /&gt;                .Select(i=&amp;gt;i.Attribute)&lt;br /&gt;                .OfType&amp;lt;MockAttribute&amp;gt;()&lt;br /&gt;                .FirstOrDefault();&lt;br /&gt;&lt;br /&gt;            Assert.AreEqual(&lt;span &gt;"this is the name"&lt;/span&gt;, attribute.Name);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;4.如何调用一个指定名称的Method？ &lt;/p&gt;&lt;pre &gt;&lt;span &gt;using&lt;/span&gt; Sparrow.Reflection;&lt;br /&gt;        [TestMethod]&lt;br /&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; invoke_method()&lt;br /&gt;        {&lt;br /&gt;            var obj = &lt;span &gt;new&lt;/span&gt; MockObject();&lt;br /&gt;&lt;br /&gt;            var method = obj.Metadata().Methods.Where(i =&amp;gt; i.Name == &lt;span &gt;"SayHello"&lt;/span&gt;).FirstOrDefault();&lt;br /&gt;&lt;br /&gt;            Assert.AreEqual(&lt;span &gt;"Hi,world"&lt;/span&gt;,method.Invoke(obj,&lt;span &gt;new&lt;/span&gt; []{&lt;span &gt;"world"&lt;/span&gt;}));&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;.Proxy()&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于某些应用场景来说，使用LINQ To Object去查询并获取单一的方法、属性，字段，总觉得还是要写非常多的代码。要先.Metadata(), 接下来.Where(), 虽然代码很优雅，但是还是有很多工作要做。所以这里也提供一个针对获取单一方法、属性、字段的替代写法。&lt;/p&gt;&lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; Proxy Proxy(&lt;span &gt;this&lt;/span&gt; &lt;span &gt;object&lt;/span&gt; instance)&lt;br /&gt;        {&lt;br /&gt;            &lt;span &gt;return&lt;/span&gt; &lt;span &gt;new&lt;/span&gt; Proxy(instance);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;1.如何获取一个属性的值&lt;/p&gt;&lt;pre &gt;&lt;span &gt;using&lt;/span&gt; Sparrow.Reflection;&lt;br /&gt;        [TestMethod]&lt;br /&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; get_value_via_property_proxy()&lt;br /&gt;        {&lt;br /&gt;            var obj = &lt;span &gt;new&lt;/span&gt; MockObject { Name = &lt;span &gt;"dayi"&lt;/span&gt;, Blog = &lt;span &gt;"http://walkingboy.cnblogs.com"&lt;/span&gt;, Location = &lt;span &gt;"Xiamen"&lt;/span&gt; };&lt;br /&gt;&lt;br /&gt;            Assert.AreEqual(obj.Name, obj.Proxy().Properties[&lt;span &gt;"Name"&lt;/span&gt;]);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.如何设置一个属性的值&lt;/p&gt;&lt;pre &gt;&lt;span &gt;using&lt;/span&gt; Sparrow.Reflection;&lt;br /&gt;        [TestMethod]&lt;br /&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; set_value_via_property_proxy()&lt;br /&gt;        {&lt;br /&gt;            var obj = &lt;span &gt;new&lt;/span&gt; MockObject { Name = &lt;span &gt;"dayi"&lt;/span&gt;, Blog = &lt;span &gt;"http://walkingboy.cnblogs.com"&lt;/span&gt;, Location = &lt;span &gt;"Xiamen"&lt;/span&gt; };&lt;br /&gt;&lt;br /&gt;            var changedLocation = &lt;span &gt;"Xiamen,China"&lt;/span&gt;;&lt;br /&gt;            obj.Proxy().Properties[&lt;span &gt;"Location"&lt;/span&gt;] = changedLocation;&lt;br /&gt;&lt;br /&gt;            Assert.AreEqual(changedLocation,obj.Location);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;3.如何获取一个字段的值&lt;/p&gt;&lt;pre &gt;&lt;span &gt;using&lt;/span&gt; Sparrow.Reflection;&lt;br /&gt;        [TestMethod]&lt;br /&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; get_value_via_field_proxy()&lt;br /&gt;        {&lt;br /&gt;            var obj = &lt;span &gt;new&lt;/span&gt; MockObject { Name = &lt;span &gt;"dayi"&lt;/span&gt;, Blog = &lt;span &gt;"http://walkingboy.cnblogs.com"&lt;/span&gt;, Location = &lt;span &gt;"Xiamen"&lt;/span&gt; };&lt;br /&gt;&lt;br /&gt;            Assert.AreEqual(obj.Country, obj.Proxy().Fields[&lt;span &gt;"Country"&lt;/span&gt;]);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4.如何调用一个方法&lt;/p&gt;&lt;pre &gt;&lt;span &gt;using&lt;/span&gt; Sparrow.Reflection;&lt;br /&gt;        [TestMethod]&lt;br /&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; invoke_method_via_method_proxy()&lt;br /&gt;        {&lt;br /&gt;            var obj = &lt;span &gt;new&lt;/span&gt; MockObject();&lt;br /&gt;&lt;br /&gt;            Assert.AreEqual(&lt;span &gt;"Hi,world"&lt;/span&gt;, obj.Proxy().Methods[&lt;span &gt;"SayHello"&lt;/span&gt;](&lt;span &gt;new&lt;/span&gt; []{&lt;span &gt;"world"&lt;/span&gt;}));&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;.Proxy() Vs Dynamic&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们知道在C# 4中引入了关键字Dynamic，使得 Duck Typing （&lt;a href="http://weblogs.asp.net/britchie/archive/2010/08/03/dynamicduck-duck-typing-in-a-dynamic-world.aspx" target="_blank"&gt;DynamicDuck: Duck Typing in a Dynamic World&lt;/a&gt;） 成为一种可能。 查看如下代码&lt;/p&gt;&lt;pre &gt;&lt;span &gt;        public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; Run(dynamic obj)&lt;br /&gt;        {  &lt;br /&gt;            Console.WriteLine(obj.Name);&lt;br /&gt;        }&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个代码并没有指定参数obj的类型，obj的类型是由运行时候传入的真实值决定，只要该类型包含一个Name的属性就可以了。&lt;/p&gt;&#xD;
&lt;p&gt;但是仅仅支持Duck Typing就够了嘛？ 似乎不够动态哦。这边的.Name 是在编译时（或者说编码时）就确定，但是往往我们的使用场景中，连这个也都是动态，比如是接受自Form,或者来自配置信息，这个时候dynamic就无能为力了。&lt;/p&gt;&#xD;
&lt;p&gt;反过来看看使用.Proxy()的情况&lt;/p&gt;&lt;pre &gt;&lt;span &gt;       public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; Run(&lt;span &gt;object&lt;/span&gt; obj,&lt;span &gt;string&lt;/span&gt; propertyName)&lt;br /&gt;       { &lt;br /&gt;           Console.WriteLine(obj.Proxy().Properties[propertyName])&lt;br /&gt;       }&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;不仅支持Duck Typing，同时也支持属性名称的动态化，是不是很有脚本（javascript&amp;#8230;）的感觉呢？&lt;/p&gt;&#xD;
&lt;p&gt;代码下载&lt;a title="http://sparrow.codeplex.com/releases/view/50364" href="http://sparrow.codeplex.com/releases/view/50364"&gt;http://sparrow.codeplex.com/releases/view/50364&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;详细文档&lt;a title="http://sparrow.codeplex.com/wikipage?title=LINQ-To-Reflection" href="http://sparrow.codeplex.com/wikipage?title=LINQ-To-Reflection"&gt;http://sparrow.codeplex.com/wikipage?title=LINQ-To-Reflection&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p&gt;本文基于&lt;a href="http://creativecommons.org/licenses/by/2.5/cn/" target="_blank"&gt;署名 2.5 中国大陆&lt;/a&gt;许可协议发布，正品行货，如有雷同，皆为山寨，作者保留追究权利，在保留本文的署名&lt;a href="http://www.cnblogs.com/walkingboy/" target="_blank"&gt;陈达艺&lt;/a&gt;（包含链接）的情况下,允许进行转载，演绎或用于商业目的。如您有任何疑问或者授权方面的协商，请用&lt;a href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#108;&amp;#97;&amp;#110;&amp;#103;&amp;#122;&amp;#105;&amp;#46;&amp;#116;&amp;#101;&amp;#99;&amp;#104;&amp;#64;&amp;#103;&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#46;&amp;#99;&amp;#111;&amp;#109;" target="_blank"&gt;E-Mail&lt;/a&gt;/&lt;a href="msnim:chat?contact=cnlangzi@live.com" target="_blank"&gt;MSN&lt;/a&gt;联系我。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/walkingboy/aggbug/1797024.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/walkingboy/archive/2010/08/11/linq-to-reflection.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/walkingboy/archive/2009/11/04/do-you-understand-html.html</id><title type="text">你真的懂HTML吗-从&amp;quot;最新闪存&amp;quot;说起</title><summary type="text">博客园最近正在整合闪存和博客.刚好我最近也在捣腾博皮,所以关注了下整合的结果.不得不说,园子最终的生成的html相当的不规范,语义性混乱,或者说很多冗余,这也许就是所谓的div强迫症/class强迫症</summary><published>2009-11-04T15:05:00Z</published><updated>2009-11-04T15:05:00Z</updated><author><name>浪子</name><uri>http://www.cnblogs.com/walkingboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/walkingboy/archive/2009/11/04/do-you-understand-html.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/walkingboy/archive/2009/11/04/do-you-understand-html.html"/></entry><entry><id>http://www.cnblogs.com/walkingboy/archive/2009/10/27/linqtosqlite.html</id><title type="text">LINQ TO SQLite实践指南</title><summary type="text">当前,软件应用程序中,数据库已经成为不可缺少的重要组成部分.然而传统数据库正趋向巨无霸化,对系统的要求一步步提高,管理成本也越来越大,对于中小型项目的应用,它的很多功能变得越来越多余,但是我却不得不为这些不需要的功能付出更多的资金和人力成本. 在这些场景,嵌入式数据库的轻量,零部署,跨平台,义移植,无疑有着传统数据库无可比拟的优点,当然为此我们必须放弃高容量,高性能,高并发,不过谁在乎这些呢?我们只是中小型应用而已,大小不上百万,并发不超万^_^.在.Net中,我们可以选择的嵌入式数据库还是挺多的,db4o,sqlite, 各种xml db. 我之前更倾向于使用db4o,db4o对于用传统ADO.Net驱动的开发有更多的优势,无需手动Mapping,零SQL.不过整因为db4o做了很多处理,所以在数据持久化的过程中,我们能干预的也很少,而db4o在复合属性,级联属性,特别当整个系统使用富领域模型设计的时候,保存数据的时候往往会出错.为此我</summary><published>2009-10-27T14:50:00Z</published><updated>2009-10-27T14:50:00Z</updated><author><name>浪子</name><uri>http://www.cnblogs.com/walkingboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/walkingboy/archive/2009/10/27/linqtosqlite.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/walkingboy/archive/2009/10/27/linqtosqlite.html"/></entry><entry><id>http://www.cnblogs.com/walkingboy/archive/2009/10/20/test_driven_or_test_first.html</id><title type="text">[TDD]由SearchCriteriaBinder看Test Driven与Test First</title><summary type="text">很久没有维护blog,近两年新工作平平淡淡,生活迷迷糊糊,自己都不知道自己在做什么了,最近看了老赵 的我的TDD实践：可测试性驱动开发（下）和Shuhari的用TDD方式实现老赵的SearchCriteriaBinder,一时手痒,也来凑凑热闹,赚赚人气.我觉得老赵 之所谓觉得实施TDD很困惑,主要是没有把握好"Test Driven"和"Test First"之间的差别. 我们这里先不下结论.先演示我根据自己的理解,利用测试驱动开发SearchCriteriaBinder的过程.</summary><published>2009-10-20T14:43:00Z</published><updated>2009-10-20T14:43:00Z</updated><author><name>浪子</name><uri>http://www.cnblogs.com/walkingboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/walkingboy/archive/2009/10/20/test_driven_or_test_first.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/walkingboy/archive/2009/10/20/test_driven_or_test_first.html"/></entry><entry><id>http://www.cnblogs.com/walkingboy/archive/2009/01/13/ScriptLoaderV5.html</id><title type="text">[OpenSource] ScriptLoader V5:不一样的体验,客户端分布式缓存平台</title><summary type="text">我一直觉得,做技术追求的就是"平常中识妙处,腐朽处见神奇!".在某些不起眼的地方,发现不一样的精彩.ScriptLoader终于到了V5了,这个版本才真正实现了我原来的大部分功能设想,或许它会带给你一个意想不到的应用场景^_^</summary><published>2009-01-13T13:15:00Z</published><updated>2009-01-13T13:15:00Z</updated><author><name>浪子</name><uri>http://www.cnblogs.com/walkingboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/walkingboy/archive/2009/01/13/ScriptLoaderV5.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/walkingboy/archive/2009/01/13/ScriptLoaderV5.html"/></entry><entry><id>http://www.cnblogs.com/walkingboy/archive/2009/01/09/ScriptLoaderV4.html</id><title type="text">[OpenSource] ScriptLoader V4:与组件系统共舞,让分享更清晰</title><summary type="text"># 将使用的.Net Framework从3.5降为2.0.# 实现了原来支持多语言资源(js,js变量资源)载入的功能.# 实现了添加自定义namespace的功能,主要用于组件间的类库区分,便于各组件之间的协调,减少冲突的可能.# 增加自定义请求后缀名,解决某些IIS站点下,asp.net没办法捕获到.js/.css的httphanlder的bug.# 修改了原来的某些bug,比如监视文件的变动.</summary><published>2009-01-09T15:29:00Z</published><updated>2009-01-09T15:29:00Z</updated><author><name>浪子</name><uri>http://www.cnblogs.com/walkingboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/walkingboy/archive/2009/01/09/ScriptLoaderV4.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/walkingboy/archive/2009/01/09/ScriptLoaderV4.html"/></entry><entry><id>http://www.cnblogs.com/walkingboy/archive/2008/07/21/Tor_SourceForge.html</id><title type="text">利用Tor(The Onion Router,洋葱路由)访问Sourceforge</title><summary type="text">今天看到 eaglet 的SourceForge 的中文替代网站发现现在不能访问sourceforge的朋友不在少数.而且维护这样子一个镜像站点工作量相当艰巨,并且意义不是很大,在此分享下自己的代理方案. </summary><published>2008-07-21T15:59:00Z</published><updated>2008-07-21T15:59:00Z</updated><author><name>浪子</name><uri>http://www.cnblogs.com/walkingboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/walkingboy/archive/2008/07/21/Tor_SourceForge.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/walkingboy/archive/2008/07/21/Tor_SourceForge.html"/></entry><entry><id>http://www.cnblogs.com/walkingboy/archive/2008/06/13/ScriptLoaderV2.html</id><title type="text">[OpenSource]ScriptLoaderV2:彻底改变你的编程习惯</title><summary type="text">[OpenSource]ScriptLoader: 轻松管理你的js 类库一文发布后，有的园友反映，侵入性还是有点太强。昨天晚上半夜想到一个不错的点子，越想越睡不着，最终还是爬起来把ScriptLoader升级到了V2，这个版本将给你更便利的脚本文件组织体验，增加了自动关联、多语言支持途径、诱人的Syntactic Sugar，使用ScriptLoader将改变你以往的编程习惯^_^。</summary><published>2008-06-13T05:24:00Z</published><updated>2008-06-13T05:24:00Z</updated><author><name>浪子</name><uri>http://www.cnblogs.com/walkingboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/walkingboy/archive/2008/06/13/ScriptLoaderV2.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/walkingboy/archive/2008/06/13/ScriptLoaderV2.html"/></entry><entry><id>http://www.cnblogs.com/walkingboy/archive/2008/06/09/ScriptLoader.html</id><title type="text">[OpenSource]ScriptLoader: 轻松管理你的js 类库</title><summary type="text">    ScriptLoader是SmartScript的后续版本. ScriptLoader可以让你通过一个单一的配置文件来管理你的所有js类库,包括自主开发与第三方类库,无需加入自己的任何代码.新版本的ScriptLoader拥有更多的特性和更好的性能.支持自动载入依赖脚本,自动更新版本,更新客户端缓存,同时支持客户端和服务端编程,使得js类库的载入更加透明化,更加易读.相信ScriptLoader一定会成为你开发Asp.net webstie的良好助手. </summary><published>2008-06-08T17:15:00Z</published><updated>2008-06-08T17:15:00Z</updated><author><name>浪子</name><uri>http://www.cnblogs.com/walkingboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/walkingboy/archive/2008/06/09/ScriptLoader.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/walkingboy/archive/2008/06/09/ScriptLoader.html"/></entry><entry><id>http://www.cnblogs.com/walkingboy/archive/2008/05/13/Windows_Mobile6_Professional_Emulator_Serial_Port_Configuration.html</id><title type="text">关于Windows Mobile 6 Professional Emulator中的一个串口设置小问题.</title><summary type="text">我被这个问题晕了一个中午,以为是公司的电脑的问题,晚上回家发现家里也一样.仔细看了下,才发现这个框框是可以输入的,巨汗,这个设计真的有点不太友好啊.同是MS的东东,Microsoft ActiveSync就友好多了.</summary><published>2008-05-13T14:22:00Z</published><updated>2008-05-13T14:22:00Z</updated><author><name>浪子</name><uri>http://www.cnblogs.com/walkingboy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/walkingboy/archive/2008/05/13/Windows_Mobile6_Professional_Emulator_Serial_Port_Configuration.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/walkingboy/archive/2008/05/13/Windows_Mobile6_Professional_Emulator_Serial_Port_Configuration.html"/></entry></feed>
