Fork me on GitHub
我的.Net武器库

工欲善其事,必先利其器。

N多年前微软官网曾发了.Net下必备的十种工具,N多年过去了,世异时移,很多东西都已经变化了,那个列表也似乎陈旧了。而且,该文也只是对十种工具独立的介绍,显得有些罗列的感觉,是不是每个工具都是同等重要,工具与工具之间是否有联系?等等,阐述得并不明确。

这里,我想从另一个角崖,重新归纳一个更新的更实际的武器库。更新,是因为有很多最近几年才出来的工具/框架库,更实际,是因为我自己的项目就完全依赖使用。

Visual Studio

这个似乎是不言而喻的,只是从严谨的角度,也列在这。实际上,现在也有一个开源的IDE开发环境发展也不错,叫SharpDevelop。我并没有仔细看,不敢妄评。而我因要用到之后会讲的Resharper,也迫使我只能用VS。

Resharper

无论是从其名称,还是实际功能,Resharper绝对称得上利器,一旦你用熟了你就再也离不开它了。我去年换工作,很大一部分原因就是因为原单位不让我使用Resharper。几个面试,我也总在重复提出我这一要求。直至最新版本6.1为止,Resharper已经是个多面手。早期,它还只是个重构的工具,如今它是反编译器(原来的Reflector.Net就用不上了),还是个代码审查工具(代码规范审查),还是代码生成器(Code Smith又用不上了),最后,它对键盘快捷键的组织使用,对无鼠标操作极其有益。一句话,Resharper能极大提高编码的效率,利器更是重器。

Fluent nHibernate

这件武器其实分为两部分,一个是Fluent,一个是nHibernate (这不是废话)。nHibernate知道了解的人很多,就是一个ORM工具,而加上Fluent之后就知之甚少了。从功能上,Fluent只是在原来ORM工具基础加上一层封装,以Fluent Interface形式提供了使用nHibernate的API。可是别小看这一层封装,从使用体验和效率提高方面,Fluent nHibernate有着卓越的功效。就我个人经历,就是在Fluent nHibernate之后,才真正使用,喜爱上nHibernate本身。让大多数人比较头疼的创建映射XML文化,被全部C#文件代替,甚至可以完全省略。可以说这两部分是一个完美的结合,后者提供强大的基础功能,前者提供完美的使用接口。这不是一个成功软件必须的两个要素吗?什么是ORM,不会吧,放狗搜搜就知道了。我只想强调的是,不要把它仅仅看作一个功能库,它更是个架构设计的利器。从架构的角度,它把业务域和数据层隔离,使得数据模型和业务域模型独立设计成为可能。这一点的影响是非常深远的。

nUnit + Machine Specification + Rhino Mock + AutoMocking

啊呀,不得啦。上一武器,我一下子介绍俩,这一次白送四个。这也体现我写本文的指导思想,从开发使用的角度来叙述而不是从工具提供者来还分。这四个套件在一起实在是太完美了!nUnit又是一个众所周知的测试框架,它提供了测试的基础功能和概念。MSpec从BDD的角度,封装了一下nUnit,也可以说是重构了一下语法,使测试可具有可读性,提供良好的测试组织结构,进而可以测试完了,直接生成一个完美的测试结果文档。Rhino Mock也是一个熟客了,但是旧中有新,新的几个版本也加入了一些可圈可点的新性能,如所谓AAA语法(Arrange, Action, Assert 这与MSpec的 Establish, Because, It关键词完全契合)。而从我的角度,看到的亮点仍然是可读性的改进。最后,AutoMock的出现又让事情更加简单了,连创建Mock对象的语句都省掉,只要你把依赖类的接口,在被测试的类的构造器中声明传入,AutoMock就自动为你创建Mock对象就,如同它的名字所表达的一样自动Mock。当然,还有高级应用,暂不赘叙。

SQLite

什么,数据库也算?是的,不过这里SQLite不是我的产品数据库,而是用它的内存数据库做集成测试的工作,可以说是集成测试的利器。I\O读写历来是性能的瓶颈,而敏捷编程对测试的高度依赖,也是对测试性能的高度要求。即使是高度覆盖率的单元测试也仍然不够,我们依然希望能在持续构建(CI)中,每次能自动运行集成测试。而如果要有真正独立、干净的集成/用例测试,最好是每个测试用例完全重建数据库,重置测试数据,这样的要求,只有内存数据才能得到良好的性能。使用SQLite证的内存库后,不光集或服务器可以轻快的完成集成测试。开发人员本地,也把集成测试很快的运行完。这样,我们的敏捷流程中不仅包括单位测试必须通过,甚至也包括了集成测试。它的名字叫用户故事。

不过这个工具有个小小的问题,因为SQLite是基于C开发的,针对32位和64位系统,它分别发布了两套控件,所以你必须根据自己的平台,3引用不同的Dll文件。而且,VS项目编译设置还必须明确指明是x86还是x64,不能设为Any CPU。就为这个由题,我很是头疼了几天,最后才找到这个解决方安案。使用上,由于前面使用了Fluent nHibernate,除了配置,不用对代码做任何改动。如果要改改了,也就不是真正的集成测试了,不是吗?

Git

如果你能一天就把代码写完,你就不需要源代码管理,你能吗?做为一个源代码管理的新秀, Git的发展是极其迅猛的。我看好它,是它优秀的底层设计,优秀的业务模型. 如果要了解什么是DDD,Git是一个非常好的典范。一般的源代码管理,都是基于单个文件的版本控制,而Git一开始设计就是基于每个提交(代码文件树)来追溯版本。你可能会不赞同我的说法,因为,很多代码控制仍然提供了项目级的分支或者版本,其实那只是一个假像。VSS,SVN,TFS的最底层,都先是文件版本控制,在这个基础之上,再提供项目版本的功能。而Gif却恰恰相反。这个很重要吗?是的,区别非常之大。引用DDD的思维,即然,从用户的角度,代码控制版本是基于文件树的,为什么你的业务模型却不是呢?所以,我把耙VSS,SVN等的这种实现方式,看作打补丁/修补方式,总有一天,补了摞补了,至于最后,再也不能修补了。还有一点Git是分布式代码管理库。

TeamCity

嘘(抹汗),总算到讲到最后一个,已经写得太长太多了,写者累,看者烦。从CI工具的鼻祖CCNet升级到TeamCity之后,感觉确实不一样,鸟枪换炮。为什么要CI,好像不是我这一篇短文可以讨论清楚的。

TC的好处,第一:是商业软件并且免费,一般这两点很难同时出现。当然有个限制,如果你只使一个编译代理服务的话,这个对我来说已经足够。第二:它对很多三方工具支持做得很好。如, nUnit, MSpec,Git等。最重要的是它是CI服务器!

 

好了,这就是目前我的兵器,已经足够了,让开发的流程顺畅,让你新的想法得以实现。敏捷在哪里,就在这些工具里。是否对你有用,欢迎点评,反馈。仍然还在看一些其它的工具,希望在真正使用获益之后,再为这个推荐列表添加更多成员。

摘要: 因为前期,重点放在业务分析上,这两块一直认真思考过,觉得很简单.一开始只是找了一个nHibernate的示例, 就决定把Session的Open和Close和事务(Transaction)的Commit, 放在HttpModule中处理. 算是Session per Request的模式.之后,继续加入错误处理的PlugIn, 做了一个HttpHandler的Decorater, 在所有其他HttpHandler的最外层. (我使用的是自己实现的FrontController来处理页面). 这样一来, 任何页面处理中,没有被截获的错误都回被最后一道防线网住.可是, 等等, Transactio阅读全文
posted @ 2010-07-15 05:16 予沁安 阅读(34) | 评论 (0) 编辑
摘要: 近期在做一个Web的项目. 即不用WebForm也不用MVC, 走了第三条路,做自己的一个框架用FrontControll.可是,HTML模版这一块太大,仍然使用Asp.net的解析. 使用aspx文件做模版. 开始,使用Server.Transfer来装载模版文件( 类似Server.Transfer("my template.aspx") ).一切都没有问题, 效果很好, 速度也快, 过程中我也反过来看了Asp.netWeb Page类实现, 太重了, 那可能是很多Web应用比较慢的原因.可是,当我开始实现统一的错误处理时, 却碰到个意想不到的问题: 每个页面每次都报错阅读全文
posted @ 2010-07-14 00:49 予沁安 阅读(30) | 评论 (0) 编辑
摘要: 时间的尺度:小时(1~2小时),天(0.5~3天), 星期(1~2星期), 月(1~3月),年.仅仅使用以上的时间尺度来衡量任务. 比如, 说1个任务需要量10个小时是没有意义的, 要折算成天,如2天.同样,说这个用户故事要20天完成,不如说要1个月. 尺度的恰当使用,会对项目管理很有帮助. 组织好开发的节奏.任务的粒度: 目前为止,在我的实际应用当中, 开发人员个人的工作过程中最基本的任务单位以1小时为宜, 这也是上面最小的时间尺度.这不一定是项目分配任务, 多数情况应该是开发人员的分解任务.这个粒度的好处在于, 每一个小时, 你能有机会喘口气. 另外,任务还有一个完成标志的定义, 另文再叙阅读全文
posted @ 2010-07-08 00:03 予沁安 阅读(21) | 评论 (0) 编辑
摘要: 在心理学上有个有名的故事,就是一只大象,在它小时候被一根细细的绳拴在一根小小的桩上,只是它那时没有力气挣断,于是它试了又试,最终不得不放弃。等它成年后,仍然一个小小的桩、一根细细的绳就能缚住它,它已习惯不再挣扎阅读全文
posted @ 2010-07-01 00:16 予沁安 阅读(15) | 评论 (0) 编辑
摘要: SCRUM是项目(公司)的层面.Agile是软件开发流程(的层面).Pattern是技术层面. Pattern只是一个有代表性的词而已, 其实涵盖更多与技术有关的东西.比如光是Pattern就有Design Pattern, Architect Pattern. 其他技术性的东西: 面向接口编程, 合同编程(Design by Contract), DDD(Domain Driven Development), TDD(Test Driven Development),阅读全文
posted @ 2010-07-01 00:09 予沁安 阅读(18) | 评论 (0) 编辑
posted on 2012-04-04 20:37  HackerVirus  阅读(261)  评论(0编辑  收藏  举报