在DDD和領域建模的背景下,假設我有一個Product
類,它具有id
,0 price
屬性,我在業務邏輯中廣泛使用這些屬性。但是,我的表示層也需要一個image
屬性。我不認爲我應該把它放在我的領域層(因爲它沒有被我的業務邏輯無處使用),但是我想要考慮在哪裏放置它。我應該創建一個ProductViewModel
並將它從Product
類組裝到某個地方嗎?程序集應該在應用程序層完成嗎?這裏有什麼選擇?域模型的演示屬性?
2
A
回答
1
一種情況是使用像一個DTO是有用的,當你在你的表示層模型和底層域模型之間的顯著不匹配。在這種情況下,製作從域模型映射的演示特定外觀/網關並呈現便於演示的界面是有意義的。它非常適合演示模型。我希望在新的一卷中更多地談論這一點。這是值得做的,但它只是值得做對具有這種不匹配的屏幕(在這種情況下,它是不是額外的工作,因爲你不得不做的橫豎屏。)
如此看來沒關係創建某種ProductViewModel
。
關於它應該創建的地方Martin Fowler說正確的方法是創建一些知道如何加載,保存和更新模型的ProductViewModelAssembler
。
在我上一個項目中,我們設法不使用匯編程序,只是在DTO中創建接受所有必要數據的構造函數。但是你仍然需要編寫一些保存和更新底層域模型的代碼。
0
通常我總是將命令分開。
命令從消費者(例如客戶端應用程序)發送到我的服務層。然後,服務層將請求路由到應用程序層,其中域和基礎結構層用於執行請求。
查詢也發送到我的服務層,但應用程序層繞過域層直接查詢數據庫;所以它不使用域實體,但它有它自己的查詢實體(如果你喜歡,可以使用表示實體);這與域實體不同。
如果我將您的情況投影到此體系結構中,那麼應用程序層將負責構建包含圖像的查詢結果實體。由於域圖層不用於查詢,因此域實體不知道圖像。
你不會提供關於你的架構是什麼樣子的細節(你揭露了什麼實體到你的表示層?域實體本身或DTO的?看起來here),看起來你沒有這種分離,但同樣的概念無論如何適用:如果圖像是一個介紹的問題,不要添加它做你的域名實體。一個有效的選項可能是創建一個包含圖像屬性的視圖模型,並且您的控制器將負責正確構建它。
相關問題
- 1. 剃刀視圖顯示域模型屬性不知道域模型
- 2. Android演示文稿模型:如何在演示模型中包裝模型?
- 3. 查看模型/演示模型
- 4. 域模型(暴露公共屬性)
- 5. 動態域模型屬性不加載
- 6. DTO/VO和演示模型
- 7. LINQ投影演示模型
- 8. 演示文稿模型
- 9. Rails - 如何顯示模型的屬性
- 10. 如何一般地將領域模型映射到演示模型?
- 11. 永久模型到域模型映射而不暴露域對象屬性
- 12. 如何通過更改演示文稿模型屬性來更新記錄?
- 13. android MVP - 多模型的演示者
- 14. Rails模型中屬性的屬性
- 15. UML:模型的附加屬性屬性
- 16. 忽略模型屬性上的屬性
- 17. 顯示視圖從模型屬性
- 18. 模型屬性不顯示與MVC4
- 19. Mvc4在View中顯示模型屬性
- 20. 不顯示Spring MVC模型屬性
- 21. Spring MVC模型屬性值不顯示
- 22. 模型視圖模型的屬性
- 23. MVC模型屬性
- 24. 模型 - 視圖 - 演示者:爲什麼模型是靜態的?
- 25. django和模型的屬性
- 26. 檢查模型的屬性
- 27. 模型的動態屬性
- 28. Rails的模型屬性
- 29. Django的模型屬性
- 30. * - Biba模型的屬性
爲什麼不把名爲Image的屬性放在實體上?如果你在商業概念上的產品有一個'圖像',我沒有看到爲什麼不在你的實體中包含這個屬性。即使此屬性沒有行爲,它也是您的域實體的一部分。 – GuFigueiredo
正如我在我的問題中所說 - '圖像'不屬於任何業務層。 – acid
圖像是否屬於不同的有界上下文?有沒有關心圖像的領域專家(即關注維護目錄的人)? – JefClaes