在JiveJdon3中,com.jdon.jivejdon.service.ForumService和Forum實(shí)體模型及其值對(duì)象ForumState共同完成領(lǐng)域模型,其中ForumService屬于應(yīng)用服務(wù)層;而后兩者屬于領(lǐng)域?qū);其他服?wù)ForumMessageService、AccountService和UploadService等都是此類性質(zhì)。
領(lǐng)域?qū)ο蟮纳芷赟cope
Spring 1.x剛出來(lái)時(shí)確實(shí)忽悠了大家一把,因?yàn)樗麤](méi)有領(lǐng)域?qū)ο蟮纳芷谥С,直到Spring 2.0才將如new Bean scope,當(dāng)初那些瘋狂捧Spring 1.x 臭腳的所謂高手是不是還是基于數(shù)據(jù)庫(kù)驅(qū)動(dòng)的思維,根本沒(méi)有真正OO模式思維,當(dāng)今天JBoss Seam、Scopes等框架開(kāi)始重視對(duì)象生命周期支持后,曾經(jīng)發(fā)生在Jdon社區(qū)爭(zhēng)戰(zhàn)硝煙已經(jīng)過(guò)去,成為歷史。
Eric認(rèn)為:每個(gè)對(duì)象獨(dú)有器生命周期,一個(gè)對(duì)象在創(chuàng)建以后,可能要經(jīng)歷各種不同的狀態(tài),并最終消亡。 對(duì)象生命周期由長(zhǎng)短:臨時(shí)對(duì)象;常駐內(nèi)存;有的與其他對(duì)象存在復(fù)雜的依賴關(guān)系;狀態(tài)變化時(shí)必須滿足一些不變量的約束條件。 如何管理這些對(duì)象提出挑戰(zhàn)!處理不好會(huì)偏離MDD的方向。
在生命周期中維護(hù)對(duì)象的完整性。避免模型由于管理生命周期的復(fù)雜性而陷入困境。有 三個(gè)模式來(lái)處理:聚合(Aggregate):定義清晰的所有權(quán)和邊界使模型更加緊湊,避免出現(xiàn)盤(pán)根錯(cuò)節(jié)的對(duì)象關(guān)系網(wǎng);工廠(Factory)和組合(Respository)。
當(dāng)一個(gè)對(duì)象生命周期之始,使用工廠和組合提供了訪問(wèn)和控制模型對(duì)象的方法,完善了MDD。 建立聚合的模型,并且把工廠和組合加入設(shè)計(jì)中來(lái),可以使我們系統(tǒng)地對(duì)模型對(duì)象進(jìn)行管理。 聚合圈出一個(gè)范偉,在這個(gè)范圍中,對(duì)象無(wú)論在哪個(gè)生命周期,保持不變性。
在JiveJdon3.0中,值對(duì)象ForumState是被聚合在實(shí)體模型Forum中,F(xiàn)orum作為ForumState的一個(gè)根,由于它們數(shù)據(jù)必須保持一致性,不變量(invariant)是指無(wú)論何時(shí)發(fā)生數(shù)據(jù)變化必須滿足一致性規(guī)則,由于根控制了訪問(wèn),就無(wú)法繞過(guò)它修改內(nèi)部元素,例如,如果沒(méi)有Forum實(shí)體對(duì)象這個(gè)根,就無(wú)法去修改對(duì)象狀態(tài)ForumState,F(xiàn)orumState獲得是通過(guò)Forum的getter方法獲得的。
ForumState和Forum的分離有可以使修改狀態(tài)數(shù)據(jù)(當(dāng)發(fā)一個(gè)新帖時(shí),必須更新當(dāng)前的最新帖子為該新帖),不會(huì)影響到Forum其他元素,特別是使用事務(wù)鎖定時(shí),不必鎖住整個(gè)對(duì)象,見(jiàn)"領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)"書(shū)籍P92。
另外,F(xiàn)orumThread和ForumMessage的關(guān)聯(lián)關(guān)系必設(shè)定成單向的,而不是雙向的,因?yàn)轭I(lǐng)域建模中,關(guān)聯(lián)越簡(jiǎn)單越好。