摘要: 一个优秀的架构师总是能对各种解决方案的优点和对应成本之间取得良好的平衡,而这种能力背后是架构师丰富的经验和广阔的知识体系。基于消息的软件建构模型则是架构师必备的知识点,本文将详细描述该模型的演变过程。 还记得第一次跟师傅打交道,他问我“Hi yang,你的功能设计的怎么样了?”我有点不以为然,不就是阅读全文
posted @ 2015-10-25 18:29 richiezhang 阅读(5054) 评论(34) 编辑
摘要: 随着软件行业的不断发展,历史遗留的程序越来越多,代码的维护成本越来越大,甚至大于开发成本。而新功能的开发又常常依赖于旧代码,阅读旧代码所花费的时间几乎要大于写新功能的时间。 我前几天看了一本书,书中有这么一句话: 此话虽然说的有点夸张,可是也说明了经验和智慧的的重要性。 我们所写的代码主要是为了阅读阅读全文
posted @ 2015-09-26 14:07 richiezhang 阅读(15625) 评论(109) 编辑
摘要: Shell带来的好处是毋庸置疑的,当然也需要大量的时间去练习。PowerShell作为后起之秀,同时试图打造一款更加人性化,更加易用的Shell。随着PowerShell开源跨平台的战略以及在Windows下的的崛起,PowerShell有望成为下一个更加流行的Shell。 当然,PowerShel阅读全文
posted @ 2017-01-15 19:57 richiezhang 阅读(1589) 评论(4) 编辑
摘要: 一、DIP原则 高层模块不应该依赖于底层模块,二者都应该依赖于抽象。 抽象不应该依赖于细节,细节应该依赖于抽象。 该原则理解起来稍微有点抽象,我们可以将该原则通俗的理解为: "依赖于抽象” 。 该规则告诉我们,程序中所有的依赖关系都应该终止于 ,从而达到松耦合的目的。因为我们在应用程序中编写的大多数阅读全文
posted @ 2016-11-14 21:58 richiezhang 阅读(887) 评论(0) 编辑
摘要: Masstransit作为.Net平台下的一款优秀的开源产品却没有得到应有的关注,这段时间有机会阅读了Masstransit的源码,我觉得我有必要普及一下这个框架的使用。 值得一提的是Masstransit的源码写的非常优秀,值得每个想提高自己编程能力的.Net选手阅读,整个代码看起来赏心悦目。反之,每次打开自己公司项目的时候心情都异常沉重。所以不是.Net不行,还是咱们水平不行。 学会了Mass...阅读全文
posted @ 2016-08-02 21:49 richiezhang 阅读(1627) 评论(18) 编辑
摘要: 微软给我们提供了一种非常好用的数据库迁移方案,但是我发现周围的同学用的并不多,所以我还是想把这个方案整理一下。.NET选手看过来,特别是还在通过手工执行脚本来迁移数据库的同学们,当然你也可以选择EF的Migration方案和FluentMigrator,但是下面我介绍的这种方案符合我对团队协作的所有阅读全文
posted @ 2016-07-31 19:48 richiezhang 阅读(1210) 评论(6) 编辑
摘要: 一、为什么要实践领域驱动? 近一年时间我一直在思考一个问题:“如何设计一个松耦合、高伸缩性、易于维护的架构?”。之所以有这样的想法是因为我接触的不少项目都是以数据库脚本来实现业务逻辑。在项目初期使用这样的方式野蛮开发似乎显得很高效,但是大家其实都清楚,正是这样的项目让大家拖入了加班的深渊。这种系统维护性差,无法扩展,无法编写有效的单元测试,质量基本没有保证。 一个符合我心理预期的架构,一定不是靠使...阅读全文
posted @ 2016-07-03 10:21 richiezhang 阅读(3282) 评论(45) 编辑
摘要: 在DDD开发过程中,一个良好的Uow设计必不可少,我心目中的Uow设计应该具备以下几点: 1、有着良好的抽象,有着恰如其分的命名; 2、能够应付不同的组件,比如你的系统中可能会存在EfUnitOfWork、RedisUnitOfWork; 3、易于使用,不用开发者显示调用。Uow在一个用户请求开始到阅读全文
posted @ 2016-06-17 10:35 richiezhang 阅读(564) 评论(0) 编辑
摘要: RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具。消息队列的使用场景大概有3种: 1、系统集成,分布式系统的设计。各种子系统通过消息来对接,这种解决方案也逐步发展成一种架构风格,即“通过消息传递的架构”。 2、阅读全文
posted @ 2016-05-16 06:50 richiezhang 阅读(13268) 评论(41) 编辑
摘要: 领域驱动设计之单元测试最佳实践(二) 一直以来,我试图找到一种有效的单元测试模式,使得“单元测试”真正能够在团队中流行起来,让单元测试不再是走过场,而是让单元测试切切实实成为提高代码质量的途径。 本文将描述一种以EF Code First模式实现的领域驱动项目实施单元测试的方案。 在描述这一方案之前,让我们看看这一最佳实践源于何种考虑和最终实现的目标: 1、以MVC项目为例,如果将单元测试的重...阅读全文
posted @ 2016-05-02 10:00 richiezhang 阅读(2566) 评论(35) 编辑
摘要: 领域驱动设计之单元测试最佳实践(一) 介绍完了DDD案例,我们终于可以进入主题了,本方案的测试代码基于Xunit编写,断言组件采用了FluentAssertions,类似的组件还有Shouldly。另外本案例使用了Code Contracts for .NET,如果不安装此插件,可能有个别测试不能正确Pass。 为了实现目标中的第二点:"尽量不Mock,包括数据库读取部分”,我尝试过3种方案:...阅读全文
posted @ 2016-05-02 10:00 richiezhang 阅读(428) 评论(0) 编辑
摘要: 通过阶乘计算来认识尾递归。阶乘可以用下面的表达式来描述: n!=n*(n-1)*(n-2)…3*2*1 根据上面的表达式我们可以概括出下面的算法来计算阶乘: n!=n*(n-1)! 函数调用: 下面的替换模型描述了计算机是如何执行这一代码的: 当我们使用一个过大的数值,例如求:Factorial(5阅读全文
posted @ 2016-04-19 22:23 richiezhang 阅读(349) 评论(0) 编辑