2014-07-02 33 views
2

在DDD和領域建模的背景下,假設我有一個Product類,它具有id,0 price屬性,我在業務邏輯中廣泛使用這些屬性。但是,我的表示層也需要一個image屬性。我不認爲我應該把它放在我的領域層(因爲它沒有被我的業務邏輯無處使用),但是我想要考慮在哪裏放置它。我應該創建一個ProductViewModel並將它從Product類組裝到某個地方嗎?程序集應該在應用程序層完成嗎?這裏有什麼選擇?域模型的演示屬性?

+0

爲什麼不把名爲Image的屬性放在實體上?如果你在商業概念上的產品有一個'圖像',我沒有看到爲什麼不在你的實體中包含這個屬性。即使此屬性沒有行爲,它也是您的域實體的一部分。 – GuFigueiredo

+0

正如我在我的問題中所說 - '圖像'不屬於任何業務層。 – acid

+0

圖像是否屬於不同的有界上下文?有沒有關心圖像的領域專家(即關注維護目錄的人)? – JefClaes

回答

1

Referring to Martin Fowler

一種情況是使用像一個DTO是有用的,當你在你的表示層模型和底層域模型之間的顯著不匹配。在這種情況下,製作從域模型映射的演示特定外觀/網關並呈現便於演示的界面是有意義的。它非常適合演示模型。我希望在新的一卷中更多地談論這一點。這是值得做的,但它只是值得做對具有這種不匹配的屏幕(在這種情況下,它是不是額外的工作,因爲你不得不做的橫豎屏。)

如此看來沒關係創建某種ProductViewModel

關於它應該創建的地方Martin Fowler說正確的方法是創建一些知道如何加載,保存和更新模型的ProductViewModelAssembler

在我上一個項目中,我們設法不使用匯編程序,只是在DTO中創建接受所有必要數據的構造函數。但是你仍然需要編寫一些保存和更新底層域模型的代碼。

0

通常我總是將命令分開。

命令從消費者(例如客戶端應用程序)發送到我的服務層。然後,服務層將請求路由到應用程序層,其中域和基礎結構層用於執行請求。

查詢也發送到我的服務層,但應用程序層繞過域層直接查詢數據庫;所以它不使用域實體,但它有它自己的查詢實體(如果你喜歡,可以使用表示實體);這與域實體不同。

如果我將您的情況投影到此體系結構中,那麼應用程序層將負責構建包含圖像的查詢結果實體。由於域圖層不用於查詢,因此域實體不知道圖像。

你不會提供關於你的架構是什麼樣子的細節(你揭露了什麼實體到你的表示層?域實體本身或DTO的?看起來here),看起來你沒有這種分離,但同樣的概念無論如何適用:如果圖像是一個介紹的問題,不要添加它做你的域名實體。一個有效的選項可能是創建一個包含圖像屬性的視圖模型,並且您的控制器將負責正確構建它。