關於領域驅動設計與開發過程中的一些疑惑請道友幫忙解惑,謝謝。

smcdl發表於2016-06-06
大家好,對於領域驅動設計開發來說我是一個新人,目前我在專案中強制自己實施領域驅動設計開發,為的是讓自己能快速理解領域驅動設計並在開發中運用自如,但實際結果是處處都是問題,手裡有兩本書,但看了之後感覺問題更多,下面我問幾個我目前最關心的問題,希望在此路上已有成就的道友能幫我一把。

1.領域驅動設計裡的所說的Repository的概念是我們以前用的DAO概念嗎?目前我在使用Spring的JPA來進行開發,裡面有一個JPARepository的概念, 但我的理解JPARepository的概念就是以前所熟悉的DAO模式,但是就是不知道是否是領域驅動設計裡所說的Repository的概念了。

2.聚合物件(或者聚合根物件,我也不知道這兩個是不是一個東西)大概是一個什麼樣的物件,書裡基本上都是講概念而沒什麼例子,如果一個物件裡有另一個物件的集合,而對另一個物件集合中新增刪改都透過當前物件來操作,那麼當前物件就是聚合根嗎?

3.Model與Entity可以是一個東西嗎?Model一般指的是領域模型物件,Entity一般指資料庫中的實體物件,但就我以前的開發經驗來看Entity肯定是貧血模型,而領域驅動中設計的Model物件肯定一本都不是貧血模型,另外書中有說Model是透過Repository取得,如果Model和Entity是一回事,那麼Repository豈不是和DAO是一回事了嗎?之所以提出這個問題在於,我現在應用的模型是Model為充血模型,而Model是從JPARepository中取得的,但JPARepository在基礎架構層,而Model在領域層,這樣層間的引用關係豈不是反過來了嗎?雖然書上有說依賴倒置原則,但那是對介面而言,對於我這種情況肯定不是依賴倒置的問題啊。

4.在一本書裡看到對於Repository的描述,其中一種是類似Hibernate那種,對於Hibernate我沒用過太多,對它的理解也不是很透徹,但透過書中的描述我理解是透過Repository取出的Model後,其Model物件本身就能直接運算元據庫,也就是對物件的任何修改都能直接更新資料庫,不需要顯示的再次呼叫Repository的save方法,與之對應的另一種模式就是顯示呼叫Repository的save方法才能將Model的改動持久化到資料庫中,那麼無論採用那種模式,從這段描述中我覺得領域驅動中的Repository越來越像DAO了,如果我的理解不對,請道友指正。

5.最後一個問題是與我目前的專案相關的,根據六邊形法則,介面層應該放置不同型別使用者訪問的介面,我的專案有兩個介面,一個HTTP介面,提供Restful API給移動裝置使用,另一個是Socket介面,提供字元流給一些微控制器裝置使用。Socket介面使用Netty元件來實現,Netty元件裡已經封裝了很多Socket的東西,但業務相關的東西還是需要自己來實現,但哪些是我需要放在基礎架構層的,哪些是需要放在介面層的呢?我以前的做法是將關於Socket介面的全部程式碼都放在基礎架構層,但看了六邊形法則後我覺得Socket也是一種介面,只不過面向的不是移動裝置而是微控制器裝置而已,那麼問題是將哪一部分拿到介面層呢,目前我是將自己的業務實現寫在繼承ChannelDuplexHandler的類中,那麼我感覺應該把關於業務實現的類拿到介面層中,不知道我想的對不對,請道友幫忙解惑。

以上是我在應用領域驅動設計與開發過程中遇到的問題,希望道友不吝賜教,謝謝。

相關文章