我的項目是分層如下: -我應該將Entity(Persistent)對象轉換爲DTO對象嗎?
DAL (Entity)
- >BLL (DTO)
- >ApplicationComponent (ViewModel)
。
將有多個應用程序組件(ApplicationComponent
),它將訪問BLL
。組件包括Windows服務,Web服務,Web API和MVC控制器。
我正在轉換NHibernate
Entity
對象到DTO
對象,同時將它們從DAL
傳遞到BLL
。在將此狀態傳遞給ApplicationComponent
時,BLL
再次將其轉換爲ViewModel
。
這有助於我分離問題以及如何在每個層中處理數據。我不贊成恢復NHibernate
Entity
對象可以查看以下原因: -
- 數據獲取暴露
UI
,我要隱藏(或僅在需要時暴露),如密碼,用戶類型,許可等 - 在引用/連接處,
NHibernate
在訪問屬性時會執行額外的查詢,從而使使用延遲加載無效。 - 暴露給用戶(
Entity
)的不必要的數據造成了錯誤的混淆和差距。 - 泄漏到
BLL
/UI
中的持久性實現。Entity
不適用於UI
。它在任何情況下都不能服務於UI
。 - 我們對
DTO
屬性使用屬性進行用戶輸入驗證,這與Entity
看起來很奇怪。
我現在面臨以下問題這種方法: -
- 最大的和明顯的問題是相同的功能冗餘的對象。
- 我必須在每個圖層中編寫映射器方法來轉換對象。這可以通過使用
AutoMapper
或類似的東西來最小化;但並沒有完全解決問題。
問題: -
- 這是過度分離,應該儘量避免(至少是最小化)?
- 如果這種方法是正確的,我沒有看到任何簡單的方法來完全繞過上述兩個問題。請建議。
- 如果這種方法不正確,請提出更正建議。
參考: -
Link1建議轉移
Entity
對象可以查看這在我的理解不是一個好主意。Link2建議映射
Entity
與DTO
我已經同意了。Link3沒有幫助。
Link4建議使用類似自動映射工具的東西,這是可以的。但它仍然不能完全解決問題。
Link5是一個偉大的職位。它解釋了爲什麼這些應該分開,我同意。它沒有評論如何最小化由此引起的開銷。
Link6再次沒有幫助。
編輯1:
我剛纔讀this外觀極好回答這表明使用Entity
這在UI
如果可能的話。它仍然不適用於我的大部分項目。
編輯2:
另一個優秀post建議去映射雙向,因爲我現在做的事情。它仍然沒有提出一種最小化開銷的方法。
...所以,我(團隊)投入了太多時間來映射數百個對象。並創建一個域。它似乎在工作......只是將它從服務器移動到用戶界面並返回......而許多人相互保證 - 重新映射到DTO就是方式......我不明白。即使使用automapper ..集合/參考將是挑戰。儘管很少覆蓋Newtonsoft.Json(解析器,實體和數組值解析器)......而JSON序列化/反序列化正在解決所有問題。沒有DTO,沒有新的對象...只管理JSON-ification ... –