簡體   English   中英

從DAO組裝域對象的邏輯應該放在哪里?

[英]Where should reside the logic to assemble the domain object from DAO?

我在這里閱讀了幾乎所有問題,並在www上閱讀了許多相關的論據,但我仍然不確定是否要理解這一點,並且可能我錯過了其他人顯而易見的內容,因為我認為這很普遍情況...

拜托,請原諒我糟糕的英語和混亂的術語,但是我對DAO與存儲庫的差異/優勢/不足並不真正感興趣,我認為這不會改變問題的“核心”,但也許我錯了。

顯然,該示例太簡單了,每個解決方案都容易過大,但請以這為更大系統的“案例”。

假設您必須構建一個應用程序來建議推銷員與他們聯系。

每位准客戶都有一些“文本”數據(即姓名,性別,生日,地址,電話號碼,電子郵件等),一張照片以及他/她與其他人和賣方互動的一些歷史記錄。

文本數據駐留在Mysql表(人)上,文件系統中某處的照片上,有人已經發布了服務,這些服務返回給銷售員的潛在潛在聯系人列表,並給出每個潛在買家的得分。

我可能會得到以下結果:

  1. 域對象人,帶有名稱,電話號碼,地址,電子郵件和照片。 所有屬性的設置器和獲取器,以及方法getScore()。

  2. 兩個DAO,一個用於mysql表,另一個用於文件系統。

  3. 用於獲取給定業務員(應用程序的用戶,不在此示例范圍內)的潛在客戶列表的服務。

我不清楚的是:

  1. 域對象中的getScore()方法可以直接在服務層中調用服務嗎? 如果沒有,為什么?

  2. 對於來自不同DAO的數據,我是否需要單獨的DTO?

  3. 如果是這樣,我需要某種管理器或“超級” DAO,它們具有有關如何組合這兩條信息的邏輯(即從mysql DAO獲取URI,檢索文件,加載圖片)? 它應該駐留在數據層還是服務層? (在我看來,就應該存儲數據而言,它應該保留在數據層中)。

  4. 管理器或“超級DAO”的輸出應該是另一個DTO,還是可以直接是域對象?

  5. 如果是DTO,我是否需要一個服務來調用經理/超級DAO並建立域對象(在這種情況下,我認為該服務會將分數“添加”到域對象)?

我知道這是一個明確的問題,但是我無法弄清楚如何設計解決方案。

答案的起點:

  1. 我認為getScore()方法應該屬於服務而不屬於域對象
  2. 味道的問題
  3. 這是服務恕我直言
  4. 服務的輸出可以是DTO或域對象

簡而言之(我認為)

  • 域對象是“啞”類(僅在此處將數據與對象映射)
  • DAO在這里獲取數據(僅此而已)
  • DTO可用作DAO與服務之間的中介
  • 服務在此處執行相關操作(通過使用dao),例如在您計算得分的情況下

允許從下到上使用,即。 服務可以使用DAO,但不能使用其他方法來減輕更改的可能性(例如:數據庫后端更改=> DAO已更新,僅此而已)

=>社區Wiki

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM