我的識道、行道、佈道之旅——從自定義ORM工具到NHibernate

高翌翔發表於2011-12-10

說明:本文專為圖靈社群活動“喚醒你心中的佈道師”而寫,歡迎大家積極參與!

在2005年,參與的首個專案是維護一個定製化的管理資訊系統(MIS),主要應用的技術是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框架的ORM解決方案。主要用來把物件模型表示的物件對映到基於SQL的關係模型資料結構中去。),於是開始學習NHibernate,發現它功能強大,完全可以取代之前編寫的自定義ORM工具。因此決定完全拋棄自定義ORM工具,並根據領域驅動設計思想重新設計架構。

再佈道——從以資料為中心全面轉向以領域模型為中心

由於大家已經習慣了以資料為中心的開發思路,因此當我告訴大家,我們來學習一下功能強大的NHibernate、試試用領域驅動設計時,大家都表示反對(除我之外),因為表示同意就意味一個全新的開始,即從以資料為中心轉向以領域模型為中心,而這幾乎是個180度的轉變,確實一時難以接受。

於是,故伎重演,我將專案中最複雜的核心業務邏輯部分承包下來,根據領域驅動設計思想進行設計、開發。完成後再逐句給大家講解,沒過多久大家就體會到其中的優勢,開始主動學習NHibernate、並模仿我的程式碼編寫相似的功能。雖然要走的路還很長,但這至少是個不錯的開始!

結束語

子曰:己所不欲,勿施於人。因此,佈道者在佈道前,須識道、行道,而佈道時應謹記“己之所欲,慎施於人”,身教重於言傳,務必身體力行、以身示道!

我的識道、行道、佈道之旅沒有終點,希望能結識更多的同路人 :D

相關文章