今天,InfoQ 发布了 Jonathan McCracken 撰写的《 Test-Drive ASP.NET MVC 》的部分节选,我们刚好利用这次机会对作者进行一次访谈。
《Test-Drive ASP.NET MVC》这本书全面地介绍了 ASP.NET MVC 测试驱动开发 (TDD)。另外,本书还覆盖了 ASP.NET MVC 中特别令人期待的领域,作者使用 NHibernate 作为后端持久化,用 REST 来优化交互,并展示了可复用的方式来对交付的系统进行高效部署。这本书的目标读者既包括 ASP.NET 的开发人员,也包括非微软平台的开发人员。
作为访谈的一部分,InfoQ 还提供了一些优惠券,读者买这本书可以获得 25% 的折扣。使用密码“InfoQTestDrive ”在 http://www.pragprog.com/titles/jmasp/test-drive-asp-net-mvc 可以获得优惠券。
InfoQ:您写《Test-Drive ASP.NET MVC》这本书的动机是什么?
Jonathan: 我从事.NET 领域的开发已经有 9 年左右,并在两年前讲授 C#教学班的时候与 ASP.NET MVC 不期而遇。当在别的项目中使用 Ruby On Rails 框架开发的时候,我发现微软也发布了一些相似的东西,这使我很激动。这是几年中第一次由衷的对微软的产品感到兴奋,我想将它分享给这个世界。我觉得写本书应该会有助于它的传播。
另外一个很大的推动力就是测试驱动开发。Kent Beck 写的《Test Driven Development By Example》是我最喜欢的技术书籍之一。很多技术性的书籍通常把涉及到软件测试的内容放到后面的章节(譬如第九章或者第十章),这让我很无奈。我认为整个项目从头到尾都要测试先行(Test-First)。这样的话,你不仅学习了 MVC 框架,还学到如何对其进行测试。
InfoQ: 在您的书里面提到了:经验丰富的微软开发人员可能对 TDD 的重要性觉得生疏。您为何这样认为呢?
Jonathan: 我批评的是 Visual Basic。微软曾经在市场方面针对它的工具和产品做了一次大型的调查统计,专门研究这些不熟悉 TDD 技术的开发人员。大概有许多使用微软工具(或者其它厂商)的开发人员并没有注意其它可选的工具。这意味着,直到现在,TDD,依赖注入和开源工具都还没有大幅度的普及。
但是,时代在变,越来越多的公司开始采用这些技术和工具,因为已经证实它们非常高效。如果这本书的读者是一位不熟悉 ASP.NET MVC 与 TDD 的开发人员,这本书可以教会你所有这一切。
有一群.NET 的开发团队推崇 ALT.NET 信念,ALT.NET 指的是既擅长 MS 平台开发又同时关注 TDD,并天天实践 TDD 的一群人。(注:更多关于 ALT.NET 的信息,请访问: http: //msdn.microsoft 。com/zh-cn/magazine/cc337902.aspx)
InfoQ: 微软引入 MVC 框架的工作做的太晚了,但却有绝佳的好机会,他们可以从现存的 MVC 框架中挑选不同的特性。以您的经验来看,微软的 MVC 框架与其它框架相比,有没有什么不完善或者失策的地方?
Jonathan: 首先,我认为把 ASP.NET MVC 从所有的持久化框架中分离是很明智的。我一直不喜欢在 Rails 里面使用 ActiveRecord(我知道这在 Rail3.0 中已经做修改了)。作为一个开发者,我可以为项目选择一种更好的持久化机制——可能是 MogoDB、Oracle(指:TopLink)或者是 Nhibernate。
到目前为止,我觉得不完善的地方应该是 2.0 的 MVC 版本可以使用更好的验证模型(validation model)。我不喜欢在把模型传入控制器的时候总是要经过自动验证。ASP.NET MVC 团队已经在 3.0 的版本中开始着手解决这些问题了,我们会发现他们最后还是能解决的。MVC 2 还缺少高效的模板引擎,这让前台的标签显得有些冗长。在 3.0 的版本中,他们即将使用 Razor 引擎来改善,Razor 引擎是一种与 Rails 中的 REB 框架类似的模板引擎。
还有一个没有做好的地方是依赖注入。他们在工厂模式下面做的很好,可以允许开发者通过微软的框架选项来衔接,但不能在这个框架之外使用。让我有点烦恼的是,3.0 的版本计划全部使用服务定位项目容器(Common Service Locator Project)来衔接依赖注入。从某些方面上看,这对那些经常抱怨它包含静态内联 (内嵌) 调用业务定位的人来说更是错上加错,业务定位代码往往是这样写的:
public void SomeMethod() { Locator.Get<Service>().DoSomething(); }
从测试的角度来看,这代码太难看了。希望在 Redmond 的 MVC 团队可以听到大家不满的声音,并用更好的工厂模式来实现它。如果按照我自己的意愿,我觉得用 Windsor Container 作为默认的依赖注入框架应该不错…但我可不愿激起一场关于框架派别的斗争。(笑…)
InfoQ: ASP.NET MVC 框架跟其它平台上你熟悉的一些 MVC 框架比较,您认为最主要的区别是什么?
Jonathan: 我认为,ASP.NET MVC 与大多数框架比较而言,是一种更加纯粹的表现层框架。其它的 web 框架还会包含一些其它良莠不齐的东西。例如,你不能随便选择你要用的持久化框架——有时候,选用这些组件要遵从公司的政策。这对 ASP.NET MVC 的开发人员来说并不是问题,因为它并没有捆绑持久化框架。
另外一个不好的方面,就是新手面对 MVC 的时候需要挑选使用的组件。在本书的第三章对这个问题有详尽的解释,其中不仅为开发者演示了如何集成这些工具,还提供了第三方组件的集成方法。
InfoQ: 您觉得那些精通其它 MVC 框架的开发人员在 ASP.NET MVC 下能很快上手吗?
Jonathan: 我觉得没有问题 —— 我经常听到用其它语言 / 框架的开发人员老是抱怨不习惯用 VS 和 C#的语法。不过,一旦你越过了这个门槛,你应该会发现这个过度相当平缓。不过,你买一本好书来越过这个坎,也未尝不可。(笑…)
InfoQ:ASP.NET MVC 已经推出有几年了。在您的印象中,它在社区的采用率怎么样?
Jonathan: 哦,从数量方面来说,它还是在婴儿期 —— 我听说,大概有 1 百万左右的下载量。随着对 ASP.NET WebForm 市场占用率的提高,我想你会看到 MVC 使用率也会逐步提升。微软官方的立场是同时拥护 WebForms 和 MVC 两个框架。但是,我预言 ASP.NET WebForms 会慢慢衰退。
我看到 ASP.NET MVC 从开源 MVC 框架——像 python 的 Django 框架和 Ruby 的 rails 等——的市场中已经获得了一定的份额。这里有两层原因,首先比较重要的是微软等大公司的商业支持把它做得更加友好了。虽然使用 Rails 这样的框架的确可以快速开发,并且它对程序员很友好,但它并没有专门的公司为其提供支持。第二个原因在于框架本身的改变也具有演化性。从 MVC 1.0 到 MVC 2.0 的迁移就如 Rail 1.0 发展到 Rails 2.0 一样是一次飞跃。
InfoQ: 在 ASP.NET 3 的第一个预览版本中,微软创建了新的表现层引擎 Razor。您对这个引擎的印象如何?
Jonathan: 我非常喜欢它。我希望他们能做的更好,但在开始时就对它非常乐观。Razor 表现层的代码就像…嗯,就像剃刀一样利索。并且,它还支持其它方面,像 HTML 辅助等,所以我不必回头寻找。
理想的情况下,我希望看到它能做到更好,最好是阻止开发人员编写像 if/else 这样多行的代码块。我的主张是,这些事情应该属于可测试的 HTML 辅助工具。不过我可以理解为何要包含这些代码块——实际应用中,这是为了满足页面展示的逻辑要求。我觉得展示页面最好不要掺杂逻辑代码,只是展示内容,这样我晚上也能安心睡觉,因为我的代码都是经过测试的。
InfoQ:在书中您也非常关注软件部署, 并使用 Migrator.NET(来自 Ruby on Rail’s Migration 的灵感) 部署数据库结构的变更. 你认为使用 Migrator.NET 与传统的 SQL 脚本比较, 有哪些优点?
Jonathan:不错,我是很喜欢 Rails 的 migrations,就个人而言,我一直不喜欢 SQL。原因是:SQL 要让人把它们想象成行和列,不是按照对象和交互的形式。所以,不管什么时候,我都能减少直接以“一行一行”的形式与数据库交互,我当然选择 Migrator.NET 了。
使用 mgrator.NET 你只要处理 C#代码就够了。这还让升级和降级软件包更加方便。我也是 dbDeploy.NET 的粉丝——但是让我选择的话,我还是更加喜欢 C#。呵呵!
InfoQ: 在最后几分钟,您还有什么好的建议给那些经验丰富的开发人员,让他们考虑使用 ASP.NET MVC 呢?
Jonathan: 如果转向 ASP.Net MVC 的 TDD,你的开发模式会变得更加高效。如果你在 ASP.NET MVC 中不使用 TDD,你就不会意识到这个新框架强大的优势。
我特别崇拜 TDD 的领袖 Kent Benk,我觉得自己原本只是一名普通的开发人员。TDD 还有其它极限编程实践,让我成为一名中级水平以上的开发人员。这种技术很容易学习,而且也是我写这本书的原因——让其他人更易于在 MVC 的开发中使用 TDD。
InfoQ:谢谢您抽出宝贵时间接受我们的采访。
查看英文原文: Interview and Book Excerpt: Test-Drive ASP.NET MVC
感谢侯伯薇对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。
评论