如果你在CRUD的DDD應用程序頂部有一個REST層,你會讓REST層吐出域模型(就數據而言)(比如GET)嗎?在DDD應用程序中從REST API返回域模型是否好?
回答
通常,您希望能夠更改您的域對象(例如,當您瞭解有關域的新內容時),而無需將公共接口/ API更改爲系統。反過來也是如此:如果需要對公共接口進行更改,則不需要更改域模型。
因此,從這個角度來看,我絕不會像在公共界面上那樣公開我的域對象。相反,我會創建屬於公共接口的數據傳輸對象(DTO)。這樣,對我的域和公共API的更改就可以獨立更改。
您不應該暴露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
- 1. 從另一個應用程序域返回的對象是否可以在調用域中序列化?
- 2. 域模型,DDD中的域對象
- 3. 使用DDD的應用程序設計
- 4. REST API返回無響應
- 5. DDD中的域安全是否存在?
- 6. DDD Model和Rest API
- 7. 這是DDD應用程序還是域服務?
- 8. REST-ful api是否應該與您的域模型密切相關?
- 9. MVC REST API從返回DTO
- 10. DDD和CRUD類型的應用程序
- 11. composer-rest-server REST API是否返回json響應中的嵌套對象?
- 12. 在REST中,我是否應該返回表示以響應PUT?
- 13. 域模型中的DDD - CreatedBy/CreatedOn?
- 14. DDD:建模拼圖應用程序
- 15. DDD - 演示/應用程序髒檢查
- 16. REST返回空,但在java應用程序中HTTP_OK
- 17. REST API - 是否需要在每個響應中都返回令牌?
- 18. Django的API REST返回的所有對象模型中的
- 19. 從實用程序方法返回PreparedStatement是否是一種好習慣?
- 20. 在.NET應用程序中使用Jira API(不是SOAP/REST Only)
- 21. 如何使用DDD構造一個簡單的REST應用程序(spring/hibernate)?
- 22. Drupal REST從離子應用程序登錄後返回301
- 23. 重型REST應用程序
- 24. Android應用程序返回空值API
- 25. 調用REST api返回FileNotFoundException
- 26. 爲什麼在REST API中不應將域模型用作資源?
- 27. 是否有一個Rest API在應用程序購買中進行驗證?
- 28. 無法從視圖返回視圖模型,模型屬性返回就好了
- 29. 確定Facebook應用程序是否已從Facebook REST API加入書籤
- 30. REST式Web服務能否從子線程返回POST響應?
是否有可能基於註解的DTO(命令,查詢,域名事件)生成的剩餘部分,如果是如何?在這裏回答pls:http://stackoverflow.com/questions/26049934/is-it-possible-to-do-ddd-and-rest-interface-and-language-mapping – inf3rno
這是有點偏見。沒有必要人爲地「維護」DDD域中的用戶:一些概念可能「經過」儘可能接近建模,其他概念可能被隱藏(除非模型不完全正確)。另外,在原始文章「REST over DDD」方面值得懷疑。應該(大多數情況下)首先在域之上的某種應用程序層。這意味着,域對象已經分開。 –
@RomanSusi我不確定你的意思是「保護用戶的域名」;你能詳細說一下嗎?我絕對同意公共接口將處理與域相同的概念。我的意思並不是將域從公共REST接口的消費者「抽象出來」,而是關於將域對象的更改與此公共REST接口的更改解耦。 – Marijn