摘要:由于DomainRoute支持针对URL域名的捕获和构造,这有些破坏了ASP.NET Routing所制定的“协议”(ASP.NET Routing只支持Path),因此在上一篇文章中,我们需要自己构造一个辅助方法来获得一个“包含域名”的URL。不过根据尽可能强类型的原则,我们应该使用的是类似于MvcFutures中定义的基于表达式树的辅助方法。由于MvcFutures已经提供了非常充足的辅助功能,因此这其实并不需要耗费我们多少代价。 阅读全文
使用Lambda表达式编写递归函数
2009-08-31 01:40 by Jeffrey Zhao, 22912 阅读, 14 推荐, 收藏, 编辑
摘要:其实这从来不是一个很简单的事情,虽然有些朋友认为这很简单。如果您把委托变量的声明和Lambda表达式分开写为两行,那么其实这已经是一中“伪”递归了。可能已经有朋友知道“标准”的做法是什么样的,不过我这里还想谈一下我当时遇到这个问题时想到的一个做法。比较笨(非常符合我的特点),但是可以解决问题。但是装配脑袋很早给了我们更好的解决方法,希望在以后的某一天,我可以把这部分内容融会贯通地理解下来,并且可以详细地解释给大家听。在这之前,我还是听脑袋的话,把Fix强行记在脑袋里吧。 阅读全文
与protected成员有关的单元测试方式
2009-08-28 17:33 by Jeffrey Zhao, 7809 阅读, 2 推荐, 收藏, 编辑
摘要:protected是一个有趣而有用的修饰符,它把方法的访问成员严格限制在自身或自己的子类身上。换句话说,在使用过程中,protected成员对外部是开放的(因为其他类可以通过继承来使用该成员),又是封闭的(不是自身或子类的一切成员都无法访问)。而对于单元测试来说,protected成员又是尴尬的,因为它的“开放”意味着我们必须对它进行单元测试,而“封闭”又阻碍了我们在单元测试中涉及protected成员。 阅读全文
所有的成员都应该是virtual的吗?
2009-08-28 10:56 by Jeffrey Zhao, 7373 阅读, 7 推荐, 收藏, 编辑
摘要:这是一个由来已久的讨论,由于Java默认所有的方法都是可以被override的(除非手动写成final),因此从C#语言设计起初就有此番争论,甚至让Anders都出来解释了一下。最近又有人在讨论这方面话题了,虽然我的看法并没有超出这些人所涉及的范畴,但是我还是打算谈一下我的理解。退几步说,就当补充一些“实例”吧。 阅读全文
趣味编程:函数式链表的快速排序
2009-08-27 17:50 by Jeffrey Zhao, 11020 阅读, 3 推荐, 收藏, 编辑
摘要:前一段时间有朋友问我,Haskell快速排序的代码,是否可以转化成C#中等价的Lambda表达式实现。我当时回答,C#中缺少一些基础的数据结构,因此不行。经过补充之后,就没有任何问题了。后来,我觉得这个问题挺有意思,难度适中,也挺考察“基础编程”能力的,于是就自己写了一个。如果您感兴趣的话,也不妨一试。 阅读全文
再谈public类型中internal成员的坏味道
2009-08-27 10:49 by Jeffrey Zhao, 5951 阅读, 2 推荐, 收藏, 编辑
摘要:上一篇文章里我讨论了一个类中internal成员可能会造成的坏味道,并且认为如果您的类型中出现了这个情况,可能就值得检查一下设计上是不是有问题了。文章中我提出了三种可能出现internal的情况,其中两种争议不大,不过对于“public类中是否应该出现internal成员”这一点似乎引起了一些争议。从评论中发现,讨论的一部分焦点并不是我的本意,这可能是我前文描述地较为简单而造成的,因此我现在对于这个方面再进行略为详细的探讨。 阅读全文
类中的internal成员可能是一种坏味道
2009-08-26 16:54 by Jeffrey Zhao, 8277 阅读, 1 推荐, 收藏, 编辑
摘要:最近除了搞ASP.NET MVC之外,也在思考一些编程实践方面的问题。昨天在回家路上,忽然对一个问题产生了较为清晰的认识。或者说,原先只是有一丝细微的感觉,而现在将它和一些其他的方面进行了联系,也显得颇为“完备”。这就是问题便是:如何对待类中internal成员。我现在认为“类中的internal成员可能是一个坏味道”,换句话说,如果您的类中出现了internal的成员,就可能是设计上的问题了。 阅读全文
支持DomainRoute的URL构造辅助方法
2009-08-26 12:18 by Jeffrey Zhao, 6749 阅读, 1 推荐, 收藏, 编辑
摘要:上一篇文章中我们构造了DomainRoute类,这是一个将URL Routing扩展至域名的Route组件,于是现在我们便可以轻易地从一个URL的Domain部分中捕获数据并在程序中使用。不过作为URL Routing的另一个重要部分,在URL构建方面,我们还需给DomainRoute补充额外的支持。 阅读全文
配合域名作URL Routing
2009-08-25 16:00 by Jeffrey Zhao, 10973 阅读, 6 推荐, 收藏, 编辑
摘要:经常有朋友问我,如何对域名作URL Routing,他们可能希望根据域名(或自域名)来获得一些值,最终影响Controller,Action或某些参数的选择。之前我只是简单地说“扩展一下ASP.NET Routing吧”,而现在由于自己也正好需要使用这个功能,便实现了一个扩展。使用下来,效果不错。 阅读全文
常用辅助方法收集
2009-08-25 15:11 by Jeffrey Zhao, 5372 阅读, 2 推荐, 收藏, 编辑
摘要:在项目里经常会出现一些常用的,好用的扩展方法,因此也想到把它收集起来。如果您有什么好的辅助方法,也可以告诉我,希望可以成为一套丰富的辅助方法,简化我们的开发生活。 阅读全文
基于ParsedRoute的Domain Parser
2009-08-24 18:27 by Jeffrey Zhao, 5667 阅读, 1 推荐, 收藏, 编辑
摘要:之前谈了不少关于ASP.NET Routing中ParsedRoute的内容,例如它的设计以及如何调用它的功能,其目的便是为了如今的使用作准备。现在我们就基于它构建一个Domain Parser,而这个Parser也是为今后的功能打基础的。 阅读全文
再谈ASP.NET Routing中的ParsedRoute
2009-08-24 14:10 by Jeffrey Zhao, 5377 阅读, 1 推荐, 收藏, 编辑
摘要:ParsedRoute是ASP.NET Routing中的内部类,作用是根据既定模式将一段URL解析为一个RouteValueDictionary。上次的文章中我主要谈了如何利用反射使用类库的内部成员,而这次则想分享一些使用ParsedRoute时产生的一些想法。 阅读全文
Kent Beck确认参加敏捷中国大会2009,讲述其35年架构设计心得
2009-08-23 23:47 by Jeffrey Zhao, 3711 阅读, 1 推荐, 收藏, 编辑
摘要:尘埃落定,Kent Beck终于确定他的行程,将于敏捷中国大会(9月11日~12日)前两天来京参会,并以大讲堂的形式分享其在架构设计方面的心得,在大会当天会做"实效的理想主义"的演讲,和另一位敏捷宣传创始人Dave Thomas一同为大会开幕。另外,这也是KB首次来中国,欢迎一起观瞻这个有点传奇色彩的极限编程创始人、敏捷宣言创始人。 阅读全文
书籍推荐:国内第一本ASP.NET 3.5 MVC技术专著
2009-08-23 15:39 by Jeffrey Zhao, 20106 阅读, 16 推荐, 收藏, 编辑
摘要:周五的时候我知道了国内第一本ASP.NET 3.5 MVC技术专著问世了。当时忙着搬家理东西,写代码,写博客,就没有仔细搭理。现在瞅瞅,不得了,了不得,至少有四大亮点值得推荐。 阅读全文
为什么是HttpContextBase而不是IHttpContext
2009-08-21 15:15 by Jeffrey Zhao, 9942 阅读, 2 推荐, 收藏, 编辑
摘要:由于HttpContext很难进行Mock,因此为了提高可测试性,微软随ASP.NET MVC发布了一个“抽象包”,专门用于对HttpContext及其相关组件进行抽象。不过在Preview 1版本中,这些抽象都是一个个接口,如IHttpContext,IHttpRequest等等。而在下一个版本中,立即就成为了一个个抽象类,如HttpContextBase,HttpRequestBase。现在我打算从“使用”角度来谈一下,为什么这里的确应该用抽象类而不是接口。 阅读全文
在单元测试时指定HttpContext的各种Path
2009-08-21 10:02 by Jeffrey Zhao, 7372 阅读, 4 推荐, 收藏, 编辑
摘要:设置HttpContext中各种Path一直是个问题,因为被测试的方法可能用到各种Path中的任何一个,而各种Path之间有一定关联,如果我们完全手动设置Mock对象的话会是一个浩大的工程。还好,这个问题还算容易解决。 阅读全文
C#编译器对泛型方法调用作类型推断的奇怪问题
2009-08-20 16:50 by Jeffrey Zhao, 8740 阅读, 2 推荐, 收藏, 编辑
摘要:范型是.NET平台上重要的功能,范型即为一个“不确定”的类型。C# 3.0中加强了对于类型推断的力度。但是C#的代码推断作的相当不完整,刚才我又遇上了一个奇怪的问题。 阅读全文
支持Area的ControllerFactory
2009-08-20 11:33 by Jeffrey Zhao, 5721 阅读, 5 推荐, 收藏, 编辑
摘要:由于项目需要,把ASP.NET MVC 2中的Area功能搬到1.0上来吧……其实只是借用个Area名头而已,根本不是那么一回事。有时候,我们就为自己的项目做一点简单的扩展,不是很合适吗? 阅读全文
复用类库内部已有功能
2009-08-19 18:59 by Jeffrey Zhao, 8271 阅读, 8 推荐, 收藏, 编辑
摘要:经常看我博客的人可能会知道,我是一个喜欢搞点小技巧来实现某个功能的人。例如博客的皮肤,自己花了不少时间定义,也是为了效果丰富一些。当然,搞得最多的是从框架或类库内部取出一点小功能来用用,节省自己开发的时间。 阅读全文
再谈抽象类和接口
2009-08-19 12:15 by Jeffrey Zhao, 9515 阅读, 10 推荐, 收藏, 编辑
摘要:昨天我质疑了为什么定义RouteBase抽象类,而不是IRoute接口,我谈到对于一个“没有任何实现”的抽象类来说,开发人员应该使用接口。不过在后面的评论中,有朋友给了我启发,让我忽然想到更多的事情。晚上又再次翻了翻《Framework Design Guidelines》之后,打算再谈一些东西,把这个问题讨论地更加清楚一些。 阅读全文
ASP.NET Routing中最令人摸不着头脑的设计
2009-08-18 19:47 by Jeffrey Zhao, 7335 阅读, 6 推荐, 收藏, 编辑
摘要:您觉得ASP.NET Routing中最令人摸不着头脑的设计是什么? 阅读全文
DefaultControllerFactory不是线程安全的
2009-08-18 16:07 by Jeffrey Zhao, 6807 阅读, 4 推荐, 收藏, 编辑
摘要:由于项目需要,刚才打算为ASP.NET MVC应用程序增强ControllerFactory的功能,因此翻出了ASP.NET MVC的源代码开始阅读其DefaultControllerFactory。代码不多,很容易理解,不过读着读着便发现了问题,因为我发现DefaultControllerFactory不是线程安全的。 阅读全文
将Windows Live Writer打造为“所见即所得”编辑器
2009-08-18 00:14 by Jeffrey Zhao, 6287 阅读, 11 推荐, 收藏, 编辑
摘要:Windows Live Writer的最大优势之一,便是可以自动获取目标博客的样式,然后让用户在特定的样式环境下编写文章。我们可以利用它在特定样式环境下编写HTML内容,这篇文章将会提供一个指南,希望可以帮助您打造一个合适的编辑环境。 阅读全文
NHibernate中一对一关联的延迟加载
2009-08-17 09:08 by Jeffrey Zhao, 10688 阅读, 8 推荐, 收藏, 编辑
摘要:这篇文章谈论的其实只是一个小技巧,而且甚至于这个是由于我对NHibernate不够了解而造成的。因此,如果您有更好的做法也请不吝指出。这个问题也就是“如何实现NHibernate中一对一映射的延迟加载”。 阅读全文
从.NET中委托写法的演变谈开去(下):性能相关
2009-08-10 00:44 by Jeffrey Zhao, 11871 阅读, 20 推荐, 收藏, 编辑
摘要:在上一篇文章中,我们详细讲述了C# 3.0中Lambda表达式(构造委托)的使用方式,它在语义上的优势及对编程的简化——这些内容已经属于委托的“扩展内容”。不如这次谈得更远一些,就来讨论一下上文中“编程方式”的性能相关话题。 阅读全文
从.NET中委托写法的演变谈开去(中):Lambda表达式及其优势
2009-08-07 08:24 by Jeffrey Zhao, 20888 阅读, 29 推荐, 收藏, 编辑
摘要:在上一篇文章中我们简单探讨了.NET 1.x和.NET 2.0中委托表现形式的变化,以及.NET 2.0中匿名方法的优势、目的及注意事项。那么现在我们来谈一下.NET 3.5(C# 3.0)中,委托的表现形式又演变成了什么样子,还有什么特点和作用。 阅读全文
从.NET中委托写法的演变谈开去(上):委托与匿名方法
2009-08-05 12:50 by Jeffrey Zhao, 23813 阅读, 39 推荐, 收藏, 编辑
摘要:在《关于最近面试的一点感想》一文中,Michael同学谈到他在面试时询问对方“delegate在.net framework1.1,2.0,3.5各可以怎么写”这个问题。我也问过,那么我就先单独针对这个问题进行解释,然后谈谈自己为什么会提出这个问题吧。 阅读全文
适合C# Actor的消息执行方式(6):协变与逆变
2009-08-03 09:19 by Jeffrey Zhao, 8415 阅读, 6 推荐, 收藏, 编辑
摘要:在上一篇文章中,我们实现了一个简单的爬虫,并指出了这种方式的缺陷。现在,我们就来看一下,如何使用C# 4.0中所引入的“协变和逆变”特性来改进这种消息执行方式,这也是我认为在“普适Actor模型”中最合适的做法。这次,我们动真格的了,我们会一条一条地改进前文提出的缺陷。 阅读全文
Agile China 2009大会报名信息
2009-08-01 19:57 by Jeffrey Zhao, 3937 阅读, 3 推荐, 收藏, 编辑
摘要:在敏捷领域最具有影响力的技术社区InfoQ中文站、敏捷方法论的领导厂商ThoughtWorks共同主办的敏捷中国技术大会(Agile China 2009),将于9月11日~12日(周五、周六)在北京举行。届时将有超过400位来自电信、金融、互联网、教育等行业在内的高级软件开发人员、项目管理人员等参加。 阅读全文
ASP.NET MVC 2 Preview 1 发布
2009-08-01 01:35 by Jeffrey Zhao, 7246 阅读, 7 推荐, 收藏, 编辑
摘要:微软发布了ASP.NET MVC 2的Preview 1版本,并在论坛中向社区征求反馈意见和建议。ASP.NET MVC 2的“主题”是“提高生产力”,提供多个有用的功能。令人放心的是,ASP.NET MVC 2 Preview 1能够与ASP.NET MVC 1.0 RTM共存,不会影响后者的正常使用。 阅读全文
收到了《博客园精华集Web分册》
2009-07-31 09:36 by Jeffrey Zhao, 8326 阅读, 12 推荐, 收藏, 编辑
摘要:我对《精华集》这种形式的书籍也没什么好感(这是实话),认为这代表不了博客园的水平,里面选择的文章也难有太高价值——最多也就值的放在互联网上作为资源“库”的填充吧。不过翻看过后,不觉对我的想法感到羞耻。我太小看这些文章了,这些文章的确是精华——不论其他分册,目前我单指《Web分册》,甚至单指第一第二部分:HTML、CSS与标准。 阅读全文
快速计算表达式树
2009-07-29 09:25 by Jeffrey Zhao, 12844 阅读, 12 推荐, 收藏, 编辑
摘要:.NET 3.5中新增的表达式树(Expression Tree)特性,第一次在.NET平台中引入了“逻辑即数据”的概念,它是LINQ to Everything在技术实现上的重要基石之一。对表达式树进行计算,是处理表达式树时中最常见的工作了。根据我的本地测试结果,在一台P4 2.0 GHz的服务器上,单线程连续计算一万个简单的四则运算表达式便要花费超过1秒钟时间。这并非是一个可以忽略的性能开销,引入一种性能更好的表达式树计算方法势在必行。 阅读全文
适合C# Actor的消息执行方式(5):一个简单的网络爬虫
2009-07-27 09:13 by Jeffrey Zhao, 9217 阅读, 6 推荐, 收藏, 编辑
摘要:之前的几篇文章大都在摆一些“小道理”,有经验的朋友容易想象出来其中的含义,不过对于那些还不了解Actor模型的朋友来说,这些内容似乎有些太过了。此外,乒乓测试虽然经典,但是不太容易说明问题。因此,今天我们就来看一个简单的有些简陋的网络爬虫,对于Actor模型的使用来说,它至少比乒乓测试能够说明问题。对了,我们先来使用那“中看不中用”的消息执行方式。 阅读全文
IT168转载问题解决情况,以及本人博客转载方式
2009-07-25 18:22 by Jeffrey Zhao, 11425 阅读, 42 推荐, 收藏, 编辑
摘要:与IT168编辑联系之后,他们已经在文章最后添加原文链接,并且答应以后的各类转载都会符合协议。这个结局比较令人满意。此外,我在这里详细谈一下这方面的一些做法。 阅读全文
浅谈线程池(中):独立线程池的作用及IO线程池
2009-07-24 09:21 by Jeffrey Zhao, 24977 阅读, 12 推荐, 收藏, 编辑
摘要:在上一篇文章中,我们简单讨论了线程池的作用,以及CLR线程池的一些特性。不过关于线程池的基本概念还没有结束,这次我们再来补充一些必要的信息,这样有助于我们在程序中选择合适的使用方式。例如,为什么要有独立的线程池,CLR线程池到底有什么不足,IO线程池又是什么呢?有了这些准备之后,最后的试验也就非常自然了。 阅读全文
浅谈线程池(上):线程池的作用及CLR线程池
2009-07-22 09:01 by Jeffrey Zhao, 44374 阅读, 34 推荐, 收藏, 编辑
摘要:线程池是一个重要的概念。不过我发现,关于这个话题的讨论似乎还缺少了点什么。作为资料的补充,以及今后文章所需要的引用,我在这里再完整而又简单地谈一下有关线程池,还有.NET中各种线程池的基础。更详细的内容就不多作展开了,有机会我们再详细讨论这方面的细节。这次,还是一个“概述”性质的,希望可以说明白这方面问题的一些概念。文章分两段,我们先来谈谈线程池的作用,及CLR自带的线程池。 阅读全文
适合C# Actor的消息执行方式(4):阶段性总结
2009-07-20 09:19 by Jeffrey Zhao, 7930 阅读, 11 推荐, 收藏, 编辑
摘要:阶段性总结本不在计划之内,不过似乎Actor模型这方面内容还不太受人关注,因此有的朋友也误解这系列文章想要解决的问题是什么。除了这方面的解释之外,我还会对之前提出的几种做法进行综合的对比,可以进一步了解整个演变过程的思路,为接下去的改变做铺垫——因为下次改变就涉及到多个方向,每个方向都是在一定程度上真正可用的方式。 阅读全文
适合C# Actor的消息执行方式(3):中看不中用的解决方案
2009-07-17 08:45 by Jeffrey Zhao, 7173 阅读, 6 推荐, 收藏, 编辑
摘要:在前两篇文章中,我们了解到Erlang中灵活的模式匹配,以及在C#甚至F#中会都遭遇的尴尬局面。那么现在就应该来设计一个解决方案了,我们如何才能在C#这样的语言里顺畅地使用Actor模型呢?不仅如此,最好我们还能获得其它一些优势。但事情总是很难一帆风顺的,最终我们这篇文章只得出一个中看不中用的解决方案。不过……至少方向是正确的吧。 阅读全文
老赵书托(2):计算机程序的构造与解释
2009-07-15 00:11 by Jeffrey Zhao, 47873 阅读, 54 推荐, 收藏, 编辑
摘要:老赵要推荐的第一本书便是大名鼎鼎的《Structure and Interpretation of Computer Programs》,在国内可以买到中译版,即机械工业出版社的《计算机程序的构造与解释》。豪不夸张地说,这是一本影响了好几代程序员的书。自从上世纪80年代MIT开始使用这本书作为教材开始,它使用Lisp语言——直到前两年才被Python取代,但是使用哪本教材不得而知,由这个侧面也可见SICP这本书的影响力有多么深远。在技术日新月异的计算机行业,有多少教材可以经得起20年的考验? 阅读全文
适合C# Actor的消息执行方式(2):C# Actor的尴尬
2009-07-13 00:24 by Jeffrey Zhao, 12950 阅读, 9 推荐, 收藏, 编辑
摘要:在上一篇文章中,我们简单解读了Erlang在执行消息时候的方式。而现在,我们就一起来看看,C# Actor究竟出现了什么样的尴尬。此外,我还打算用F#进行补充说明,最终我们会发现,虽然F#看上去很美,但是在实际使用过程中依旧有些遗憾。 阅读全文