openfans領(lǐng)域模型驅(qū)動的嘗試

          領(lǐng)域模型驅(qū)動( Domain Driven Design ),很熱的名詞。 Openfans ,不太熱的網(wǎng)站。今天俺就借著很熱的 ddd ,給不太熱的 openfans 再造點勢。 Openfans 就不多介紹了,網(wǎng)站用 spring+hibernate 為核心的一堆開源軟件構(gòu)建。有了 spring IOC hibernate ORM ,打著 ddd 的旗號也就名正言順了很多。先聲明其實俺對 ddd 的理解也多是道聽途說,沒有什么系統(tǒng)的學(xué)習(xí)過,倒是和 Joe 阿牛討論過幾次,頗有受益,他對這個理解還是很深刻的。

          言歸正傳,就講 openfans 現(xiàn)在經(jīng) ddd 思想改造過的模型。整體上看還是普通的三層架構(gòu)體系:展現(xiàn)層、業(yè)務(wù)層、持久層。展現(xiàn)層用 spring mvc ,力圖做到只是展示相關(guān),避免出現(xiàn)業(yè)務(wù)邏輯。再具體細(xì)分,就是 jsp 頁面只有展示邏輯,主要使用 jstl 完成顯示功能。 Controller 負(fù)責(zé)從頁面獲得參數(shù)、把數(shù)據(jù)傳回頁面、控制頁面流傳和調(diào)用業(yè)務(wù)層的接口。持久層使用 hibernate ,在設(shè)計上我不是按 dao 方式為每個對象建立相應(yīng)的 dao ,也不是 ddd 推薦的每個 domain 一個 repository ,而是分成了 Persistence Fetcher2 個接口。 Persistence 處理持久相關(guān)如 save remove 方法, Fetcher 則處理 get 相關(guān)。這樣分的原因也很簡單, persistence 是很穩(wěn)固的,對象都可以共用一個接口如 save Object ),而 fetcher 就千變?nèi)f化,需要分頁、排序等接口。

          這樣設(shè)計是與業(yè)務(wù)層架構(gòu)相關(guān)的。我采用的是 domain 對象(簡稱 DO + 一層薄薄 fa?ade 的方式。 DO 處理自身的邏輯,包括持久功能。本身 DO 是沒有持久能力的,需要依靠注入的 persistence 接口,這里就體現(xiàn)按 Persistence Fetcher 分開的一個好處, persistence 所有 DO 可以共用一個,給編程帶來了方便。 Openfans 中采用的是 DO 繼承一個抽象 PersistentObject 類的方式,這樣 DO 方便的獲得了注入的能力和持久的能力。這樣做有何優(yōu)缺點還需要做些討論,為了方便我也就先這么用。 PersistentObject 代碼如下:

          public abstract class PersistentObject implements NeedPersist {

          ?????? private Persistence persistence;

          ?

          ?????? public void save() {

          ????????????? persistence.save(this);

          ?

          ?????? }

          ?

          ?????? public void remove() {

          ????????????? persistence.remove(this);

          ?????? }

          ?

          ?????? public void setPersistence(Persistence persistence) {

          ????????????? this.persistence = persistence;

          ?????? }

          ?

          ?????? public Persistence getPersistence() {

          ????????????? return persistence;

          ?????? }

          }

          這樣 DO 只需要注入 persistence 就獲得了持久的能力,而且可以把這種能力往下傳遞。 DO 獲得了持久能力,就有點接近富血模型的想法了,他能夠處理一些業(yè)務(wù),做持久然后調(diào)用引用對象的業(yè)務(wù)和持久方法 ( 從另外的角度看持久與業(yè)務(wù)其實是分不開的 ) 。這樣把業(yè)務(wù)封裝在了領(lǐng)域本身,更適于用領(lǐng)域?qū)ο蟪霭l(fā)的方式去思考問題。領(lǐng)域?qū)拥?/span> fa?ade 主要是為了 Transaction 管理和隱藏 DO 接口。這樣 DO 的業(yè)務(wù)方法都可以設(shè)置成 friendly ,僅相互間可見。 Fa?ade 就放在 domain 包中,它負(fù)責(zé)給 DO 注入 persistence bean ,調(diào)用 DO 的接口,提供給 controller 一個 use case 級別的接口,同時它也代理 fetcher 的接口。

          有了這個架構(gòu),實現(xiàn)起來也不復(fù)雜,要配置的 bean 很少(現(xiàn)在還沒有使用 spring 2.0 DO 配置在容器中)。設(shè)計就從 DO 出發(fā),明確它的屬性和方法,讓 hibernate 自己生成數(shù)據(jù)庫表。

          ?????? 這樣設(shè)計也算是一次嘗試吧,其中肯定有很多考慮不周的地方,需要不斷的討論和改進。

          posted on 2006-05-22 18:28 pesome 閱讀(1395) 評論(4)  編輯  收藏 所屬分類: 系統(tǒng)架構(gòu)

          評論

          # re: openfans領(lǐng)域模型驅(qū)動的嘗試 2006-05-25 09:27 D.B

          與我去年項目中對DomainModel的設(shè)計實現(xiàn)相似,
          跟一般理解的DomainModel不同,這樣的DomainObject是全功能的DomainObject(包括業(yè)務(wù)邏輯和持久化處理),
          優(yōu)點是Do的客戶端可以比較省心(就像EntityBean,客戶端不需要關(guān)心持久化),
          缺點是DomainObject層依賴Dao層(這是大師們所反對的)。  回復(fù)  更多評論   

          # re: openfans領(lǐng)域模型驅(qū)動的嘗試 2006-05-25 13:50 pesom

          呵呵,好容易找到個參與討論的。理想狀況是透明持久化,但由于設(shè)施還不完善,現(xiàn)在較難做到。用hibernate,如果do在session中,是不需對持久層產(chǎn)生依賴的,但不在session中的那些對象(如表單過來的對象)呢?do具備了能力,從封裝、耦合和重用的角度看,還是很有益處的。歡迎大家多做討論,可以到openfans上去討論,呵呵!  回復(fù)  更多評論   

          # re: openfans領(lǐng)域模型驅(qū)動的嘗試 2007-02-02 18:22 pig345

          與我去年項目中對DomainModel的設(shè)計實現(xiàn)相似,
          跟一般理解的DomainModel不同,這樣的DomainObject是全功能的DomainObject(包括業(yè)務(wù)邏輯和持久化處理),
          優(yōu)點是Do的客戶端可以比較省心(就像EntityBean,客戶端不需要關(guān)心持久化),
          缺點是DomainObject層依賴Dao層(這是大師們所反對的)
          -------------------------------------------------
          深有同感,
          一直沒搞清楚 業(yè)界的大師們是如何在保持富血模型的同時--讓DomainObject層與Dao層不相依賴的。
          起碼從現(xiàn)在的普遍應(yīng)用的技術(shù)上看似乎是不可能的。  回復(fù)  更多評論   

          # re: openfans領(lǐng)域模型驅(qū)動的嘗試 2007-03-25 14:32 coolfish

          現(xiàn)在看來domain object的所依賴的一些持久化的操作(DAO)的,需要借助AOP和spring 的注入來實現(xiàn)。  回復(fù)  更多評論   

          <2006年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導(dǎo)航

          統(tǒng)計

          公告

          主要記錄作者在學(xué)習(xí)java中的每一步足跡。除非特別說明,所有文章均為本blog作者原創(chuàng),如需轉(zhuǎn)載請注明出處和原作者,如用于商業(yè)目的,需跟作者本人聯(lián)系。
          歡迎大家訪問:

          常用鏈接

          留言簿(16)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          java技術(shù)

          人間百態(tài)

          朋友們的blog

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宿松县| 富民县| 黄平县| 北京市| 独山县| 阳朔县| 咸宁市| 湛江市| 砀山县| 凤城市| 左权县| 禹州市| 崇礼县| 淄博市| 思南县| 娱乐| 东光县| 北安市| 广东省| 南川市| 额敏县| 东乡族自治县| 霍城县| 临夏市| 奎屯市| 奉节县| 泰顺县| 罗田县| 武穴市| 兰溪市| 利川市| 成安县| 静海县| 格尔木市| 永胜县| 郧西县| 玛曲县| 新密市| 裕民县| 乌恰县| 东港市|