可以看出,整個(gè)業(yè)務(wù)實(shí)例被封裝到一個(gè)單獨(dú)的方法中。BookHolidayFor方法處理許多責(zé)任,如數(shù)據(jù)檢索和持久化,以及用來(lái)確定是否可以休假的業(yè)務(wù)邏輯。這種過(guò)程式編程風(fēng)格違背了面向?qū)ο缶幊痰幕纠砟?。如果邏輯始終非常簡(jiǎn)單、應(yīng)用程序較小且易于管理,那么該方式?jīng)]有問(wèn)題。
如果應(yīng)用程序較小,而且業(yè)務(wù)邏輯簡(jiǎn)單,不需要采用完全的面向?qū)ο蠓椒?,Transaction Script模式可能比較合適。但是,如果應(yīng)用程序規(guī)模會(huì)變大,那就可能需要重新考慮業(yè)務(wù)邏輯結(jié)構(gòu)并尋求更具伸縮性的模式,如Active Record模式,這正是4.1.2小節(jié)的主題。
4.1.2 Active Record
Active Record模式是一種流行的模式,尤其在底層數(shù)據(jù)庫(kù)模型匹配業(yè)務(wù)模型時(shí)它特別有效。通常,數(shù)據(jù)庫(kù)中的每張表都對(duì)應(yīng)一個(gè)業(yè)務(wù)對(duì)象。業(yè)務(wù)對(duì)象表示表中的一行,并且包含數(shù)據(jù)、行為以及持久化該對(duì)象的工具,此外還有添加新實(shí)例和查找對(duì)象集合所需的方法。圖4-2展示一個(gè)博客應(yīng)用程序中的Post和Comment對(duì)象如何與它們對(duì)應(yīng)的數(shù)據(jù)庫(kù)表關(guān)聯(lián)起來(lái)。該圖還說(shuō)明Post中含有一個(gè)Comment對(duì)象集合。
在Active Record模式中,每個(gè)業(yè)務(wù)對(duì)象均負(fù)責(zé)自己的持久化和相關(guān)的業(yè)務(wù)邏輯。
Active Record模式非常適用于在數(shù)據(jù)模型和業(yè)務(wù)模型之間具有一對(duì)一映射關(guān)系的簡(jiǎn)單應(yīng)用程序,如博客或論壇引擎。如果已經(jīng)有數(shù)據(jù)庫(kù)模型或者希望采用“數(shù)據(jù)優(yōu)先”的方法來(lái)構(gòu)建應(yīng)用程序,這也是一個(gè)可用的好模式。因?yàn)闃I(yè)務(wù)對(duì)象與數(shù)據(jù)庫(kù)中的表具有一對(duì)一映射關(guān)系,而且均具有相同的創(chuàng)建、讀取、更新和刪除(CRUD)方法,所以可以使用代碼生成工具自動(dòng)生成業(yè)務(wù)模型。優(yōu)秀的代碼生成工具還會(huì)內(nèi)置所有的數(shù)據(jù)庫(kù)驗(yàn)證邏輯,以確保只有有效的數(shù)據(jù)才會(huì)持久化。在第7章中討論如何持久化業(yè)務(wù)對(duì)象時(shí)將研究業(yè)務(wù)對(duì)象自動(dòng)化生成以及使用Active Record模式的框架。與Transaction Script模式一樣,Active Record模式也非常簡(jiǎn)單而且易于掌握。
Active Record模式隨著基于數(shù)據(jù)庫(kù)的Web應(yīng)用程序而流行,其中一個(gè)典型就是結(jié)合了MVC模式(第8章)和Active Record ORM(第7章)的Ruby on Rails框架。在.NET領(lǐng)域,構(gòu)建在NHibernate(第7章)之上的Castle ActiveRecord項(xiàng)目是最流行的開放源代碼Active Record框架之一,本書將使用該項(xiàng)目以及ASP.NET MVC應(yīng)用程序來(lái)構(gòu)建一個(gè)簡(jiǎn)單的博客網(wǎng)站。因?yàn)椴┛途W(wǎng)站只包含少量的業(yè)務(wù)邏輯,因此在業(yè)務(wù)對(duì)象和數(shù)據(jù)模型之間存在較好的相關(guān)性,Active Record模式此時(shí)就是一個(gè)很好的選擇。