2012-06-08 63 views

回答

22

通常,您希望能夠更改您的域對象(例如,當您瞭解有關域的新內容時),而無需將公共接口/ API更改爲系統。反過來也是如此:如果需要對公共接口進行更改,則不需要更改域模型。

因此,從這個角度來看,我絕不會像在公共界面上那樣公開我的域對象。相反,我會創建屬於公共接口的數據傳輸對象(DTO)。這樣,對我的域和公共API的更改就可以獨立更改。

+1

是否有可能基於註解的DTO(命令,查詢,域名事件)生成的剩餘部分,如果是如何?在這裏回答pls:http://stackoverflow.com/questions/26049934/is-it-possible-to-do-ddd-and-rest-interface-and-language-mapping – inf3rno

+2

這是有點偏見。沒有必要人爲地「維護」DDD域中的用戶:一些概念可能「經過」儘可能接近建模,其他概念可能被隱藏(除非模型不完全正確)。另外,在原始文章「REST over DDD」方面值得懷疑。應該(大多數情況下)首先在域之上的某種應用程序層。這意味着,域對象已經分開。 –

+0

@RomanSusi我不確定你的意思是「保護用戶的域名」;你能詳細說一下嗎?我絕對同意公共接口將處理與域相同的概念。我的意思並不是將域從公共REST接口的消費者「抽象出來」,而是關於將域對象的更改與此公共REST接口的更改解耦。 – Marijn

2

您不應該暴露DDD模型。這是絕對正確的,因爲SOA前端不應該向客戶端公開實現細節。你的用戶應該依賴於一個業務功能,而不是一個實現細節......但是這需要一個好的設計,將幾個可能是異構的應用程序聯合到一個SOA總線中。

我想補充一點,因爲CRUD接口的提及讓我認爲這可能是SOA濫用的情況,其中SOA原則用於粘貼應用程序層而不是應用程序網絡。 SOA是企業溝通系統的一種方式,它不是實現MVC的一種方式!這麼簡單但卻被誤解了。例如,僅僅因爲你的前端GUI使用服務來訪問後端,你就沒有「SOA應用程序」......這意味着什麼。

如果這是用於粘合層的SOA的情況,請修改您的設計並針對該抽象級別使用適當的設計體系結構。否則,你會誤解這裏提出的關於不公開DDD模型和不使用CRUDY的建議,並且你最終會爲服務接口創建一個單獨的域模型,然後你將不得不映射到DDD,這很複雜你將需要使用推土機和類似的東西來映射相同的東西不同的名稱,等等,直到我們結束了一個膨脹的不可維護的混亂...

..只是要小心。

-Alex

Redzedi是如此正確的,我們需要澄清....

喜歡的一切,這是一個相當複雜得多,說的做。對複雜域模型進行序列化可能非常困難,以至於您最終可能無法在域中插入任何邏輯,貧血模型反模式(http://martinfowler.com/bliki/AnemicDomainModel.html),或者有一個單獨的貧血模型持久性,即DTO。

我不知道什麼是最壞的,但兩種選擇都不好。您應該將模型中的邏輯放在模型中,並且您應該能夠在任何地方直接序列化。

根據我多年使用領域模型的經驗,我相信最好的東西是中間的一個點。是的,正如福勒和埃文斯所說的,商業對象應該攜帶邏輯,但不是全部(http://codebetter.com/gregyoung/2009/07/15/the-anemic-domain-model-pattern/)帶有一點貧血好的服務層是最好的。

例如,一張發票應該知道它的物品並且有一個程序來計算它的總數,這取決於物品。但發票的項目不需要知道發票。那麼,當一個物品的成本發生變化時,如果它有一個指向父發票的指針作爲循環參考並調用發票的計算總計過程,會發生什麼?

我不相信。我認爲這對於服務層來說是一項任務,他們應該首先接收事件,然後編排過程,而不必將所有業務對象連接在一起以實現目的,並違反業務交互規則(這是域模型的用途)。

-Alex

+0

感謝亞歷克斯,SOA或不是將數據從域模型映射到某些DTO的問題,以便視圖可以消耗將永遠保持,不是嗎? – redzedi

+1

您好Redzedi,我個人認爲我嘗試將域模型直接映射到數據庫。領域模型是數據模型。所以我只有一個用戶界面和數據庫的業務對象。 –

+1

這是一個非常重要的事情,你說ALex,看起來很吸引我,但我已經聽到了有關它的各種事情,Marijn上面說的是很多ppl相信的東西,但是根據我的經驗,這導致了很多類似的外觀java類在不同的層次,其中任何後續的添加導致大量的教條式代碼映射。 – redzedi

相關問題