Author: Anders小明

為何要Domain Model
傳統(tǒng)的開發(fā)方式:基于數(shù)據(jù)庫的設(shè)計(jì)開發(fā)。數(shù)據(jù)庫提供的設(shè)計(jì)模型是表和字段兩種粒度,這兩種粒度有時(shí)并不合適于系統(tǒng)設(shè)計(jì):
1. 模型的結(jié)構(gòu)化能力
1.1. 同一模塊組件下的設(shè)計(jì)優(yōu)勢;一個(gè)model可以來自多張表的數(shù)據(jù)聚合而成,一張表可以聚合多個(gè)Model;一個(gè)邏輯是由幾個(gè)固定字段或者非固定字段聚合;Model間的關(guān)聯(lián)關(guān)系也是使用表無法展示的(外鍵的約束對于系統(tǒng)開發(fā)來說實(shí)在太有限了)。而這些不論表還是字段粒度都無法支持的!
1.2. 采用Model方式容易解決項(xiàng)目的集成問題(兩個(gè)不同模塊組件訪問同一張表的情況)

2. 架構(gòu)的結(jié)構(gòu)化能力
事務(wù)腳本直接訪問到表。換句話說,其架構(gòu)只有Service + Database Table,這樣的架構(gòu)下Database Table可以說就是我們的模型。
這里看看在邏輯設(shè)計(jì)上Domain Model對于架構(gòu)影響
A. Service, Model和Repository,model的重建和關(guān)聯(lián)交由Repository完成,單個(gè)數(shù)據(jù)邏輯交給Model(支持泛化)
B. 測試的好處

3. 分析和設(shè)計(jì)的統(tǒng)一
溝通的問題,客戶關(guān)注于其業(yè)務(wù),分析的模型接近于客戶需求,設(shè)計(jì)也采用model的方式,避免分析和設(shè)計(jì)的割裂。有助于IT間,IT和BA(客戶)間的溝通

4. 其它好處
4.1.采用Domain Model可以屏蔽持久化信息。持久化設(shè)計(jì)的表設(shè)計(jì)是和DBA相關(guān)的,DBA對于表設(shè)計(jì)有權(quán)力的,采用Model可以有效隔離各自工作;
4.2.Model可以通過很多的手段透明的解決性能問題,而采用表做模型導(dǎo)致容易導(dǎo)致性能問題,當(dāng)然不是沒有辦法解決,一種是通過DataSet的方式,但這樣的切換成本較高。

應(yīng)用Domain的體系結(jié)構(gòu)
如前所述,邏輯設(shè)計(jì)上Domain Model的實(shí)施使得架構(gòu)分為Service,Model和Repository;其中Model的持久化,重建和關(guān)聯(lián)交由Repository完成;而單數(shù)據(jù)邏輯(依賴自身數(shù)據(jù)信息以及關(guān)聯(lián)數(shù)據(jù))則歸于Model(支持泛化);Service則關(guān)注于任務(wù)處理,相當(dāng)于一個(gè)macro flow,包括了多個(gè)model處理,以及其它服務(wù)的調(diào)用。
以下是示意圖:
Domain Service  | Repository
Domain Object   |

Repository和Dao
Repository是一種特殊的Service,不做任務(wù)處理;而是提供Model的持久化,重建和查詢工作。由于企業(yè)應(yīng)用大都通過數(shù)據(jù)庫實(shí)現(xiàn)持久化,因而Repository和傳統(tǒng)的Dao間的集成設(shè)計(jì)就非常重要。

已知的有三種設(shè)計(jì)方式:
1. 兩個(gè)接口兩個(gè)實(shí)現(xiàn)類。RepositoryDao各自獨(dú)立接口,而通過Repository實(shí)現(xiàn)類轉(zhuǎn)發(fā)請求給Dao實(shí)現(xiàn)類。
這種方式雖然正統(tǒng),但是維護(hù)成本太高;一次更新最多要改四處地方。
2. 兩個(gè)接口一個(gè)實(shí)現(xiàn)類。RepositoryDao各自獨(dú)立接口,一個(gè)實(shí)現(xiàn)類同時(shí)實(shí)現(xiàn)兩個(gè)接口。
這種方式就大大簡化維護(hù)成本;一次更新最多只改一個(gè)接口和一個(gè)實(shí)現(xiàn)類。
3. 兩個(gè)接口一個(gè)實(shí)現(xiàn)類。與上面不同是,Dao接口繼承Repository接口,一個(gè)實(shí)現(xiàn)類實(shí)現(xiàn)Dao接口。
這種方式的維護(hù)成本和上一種差不多,但是當(dāng)接口方法在這個(gè)兩個(gè)接口間流動(dòng)時(shí),可以通過開發(fā)工具完成。

另外Dao實(shí)現(xiàn)類本身也是工作中開發(fā)維護(hù)成本較高的一部分,可以通過代碼生成降低開發(fā)成本,更多資料可以參考ibatis。