转载至图灵社区:从自定义ORM框架到NHibernate——我的识道、行道、布道之旅

特别声明:本文专为图灵社区活动“唤醒你心中的布道师”而写,欢迎大家积极参与!

在2005年,参与的首个项目是维护一个定制化的信息管理系统,应用的技术是ASP.NET+C#+SQL
Server,是所谓的三层架构,即臃肿而混乱的表示层、干瘪的业务层、以及十分庞杂的数据访问层。当然,那时能做的只有埋头学习、还有就是一边修改老Bug一边制造新Bug。接下来的两年,都是在不断开发新项目、学习新知识中度过的。

啃《企业应用架构模式 》——初识道

在2008年,机缘巧合下载了一本名为《Patterns of Enterprise Application
Architecture》(《企业应用架构模式 》Martin
Fowler
著)的电子书,在金山词霸的帮助下,终于把它啃下来了。当时读完后的喜悦溢于言表,对于书中提到各种企业应用架构模式更是爱不释手、跃跃欲试。

尝试编写自定义ORM框架——初行道

于是,开始反思两年多来开发中的一些得失,发现代码中有许多非常简单的SQL语句,只是做CRUD(Create、Retrieve、Update、Delete,即增查改删)等基本操作,而且有很强的规律性。由此萌生了编写代码生成器的念头。经过一段时间的学习和实践,并应用了Table
Module(表模块)
Query
Object(查询对象)
等模式后,终于编写完成了能根据数据库表自动生成同名表对象类的代码生成器、以及配套使用的DataModelManager<T>和QueryConditionJointer辅助类。

补充解释一下ORM,它是Object Relational
Mapping
的缩写,即对象关系映射,是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

其实,当完成代码生成器和相关辅助类时,对于ORM的概念并不十分清楚,只是为了减少手工编写CRUD等基本操作SQL语句的工作量,从而提高工作效率。

应用自定义ORM框架——初布道

自定义ORM框架初步完成后,先在一个小项目中试用。与其说是布道,不如说是先斩后奏。一开始我就告诉项目组的同事,那些同名表对象类、以及CRUD基本操作的代码编写工作我统统包了。大家一开始觉得我在吹牛,可是当大家第二天看到那些工工整整的代码时显得既吃惊又好奇。这时我才把自定义ORM框架正式介绍给大家。从此以后,这套自定义ORM框架便推广开来,成为了随后多个项目的默认框架。当然,在开发过程中也遇到不少问题,其中大多数最终都顺利解决了,但仍有少数无法攻克。

读《领域驱动设计与模式实战》——再识道

上面提到,虽然自定义ORM框架可以解决大多数问题,并大大提高开发效率,但是随着项目规模的扩大和业务规则复杂度的增加,代码变得越来越难以控制,重复代码越来越多,代码质量极度下降。

从那时起,我开始寻找问题及其解决方案。简短节说,最终将问题定位在以数据为中心的设计思想上,当项目规模较小、业务规则相对简单时,这种设计思想可以较好地解决。而自定义ORM框架也正是基于这种设计思想开发出来的。至于解决方案就是要寻求一种更适宜的设计思想。

当接触到领域驱动设计(Domain-Driven
Design)思想时,直觉告诉我,这就是我要寻找的理想解决方案。后来读了《领域驱动设计与模式实战》Jimmy
Nilsson
著),这才豁然开朗,心中的疑云终于解开了!

学习NHibernate,重新设计架构——再行道

《领域驱动设计与模式实战》中建议的基础架构为NHibernate(NHibernate是一个面向.NET框架的对象关系映射解决方案。主要用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。),于是我开始学习NHibernate,发现它不仅功能强大,而且完全可以取代之前编写的自定义ORM框架。因此,我决定完全抛弃自定义ORM框架,并根据领域驱动设计思想重新设计架构。

从以数据为中心全面转向以领域模型为中心——再布道

由于大家已经习惯了以数据为中心的设计、开发思路,因此当我告诉大家,我们学习一下功能强大的NHibernate,试试用领域驱动设计时,大家几乎无一例外都表示反对,因为表示同意就意味一个全新的开始,即从以数据为中心全面转向以领域模型为中心,而这是个180度的转变,确实一时难以接受。

于是,故伎重演,我将项目中最复杂的核心业务逻辑部分承包下来,根据领域驱动设计思想进行设计、开发。完成后再逐句给大家讲解,没过多久大家就体会到其中的优势,开始主动学习NHibernate、并模仿我的代码编写相似的功能。虽然要走的路还很长,但这至少是个不错的开始!

结束语

子曰:己所不欲,勿施于人。因此,布道者在布道前,须识道、行道,而布道时应谨记“己之所欲,慎施于人”,身教重于言教,务必身体力行、以身示道!

我的识道、行道、布道之旅没有终点,希望能结识更多的同路人 ;-)

posted @ 2012-02-29 09:00  supernebula  阅读(264)  评论(0编辑  收藏  举报