2016-11-21 270 views
1

我的項目是分層如下: -我應該將Entity(Persistent)對象轉換爲DTO對象嗎?

DAL (Entity) - >BLL (DTO) - >ApplicationComponent (ViewModel)

將有多個應用程序組件(ApplicationComponent),它將訪問BLL。組件包括Windows服務,Web服務,Web API和MVC控制器。

我正在轉換NHibernateEntity對象到DTO對象,同時將它們從DAL傳遞到BLL。在將此狀態傳遞給ApplicationComponent時,BLL再次將其轉換爲ViewModel

這有助於我分離問題以及如何在每個層中處理數據。我不贊成恢復NHibernateEntity對象可以查看以下原因: -

  • 數據獲取暴露UI,我要隱藏(或僅在需要時暴露),如密碼,用戶類型,許可等
  • 在引用/連接處,NHibernate在訪問屬性時會執行額外的查詢,從而使使用延遲加載無效。
  • 暴露給用戶(Entity)的不必要的數據造成了錯誤的混淆和差距。
  • 泄漏到BLL/UI中的持久性實現。 Entity不適用於UI。它在任何情況下都不能服務於UI
  • 我們對DTO屬性使用屬性進行用戶輸入驗證,這與Entity看起來很奇怪。

我現在面臨以下問題這種方法: -

  • 最大的和明顯的問題是相同的功能冗餘的對象。
  • 我必須在每個圖層中編寫映射器方法來轉換對象。這可以通過使用AutoMapper或類似的東西來最小化;但並沒有完全解決問題。

問題: -

  • 這是過度分離,應該儘量避免(至少是最小化)?
  • 如果這種方法是正確的,我沒有看到任何簡單的方法來完全繞過上述兩個問題。請建議。
  • 如果這種方法不正確,請提出更正建議。

參考: -

  1. Link1建議轉移Entity對象可以查看這在我的理解不是一個好主意。

  2. Link2建議映射EntityDTO我已經同意了。

  3. Link3沒有幫助。

  4. Link4建議使用類似自動映射工具的東西,這是可以的。但它仍然不能完全解決問題。

  5. Link5是一個偉大的職位。它解釋了爲什麼這些應該分開,我同意。它沒有評論如何最小化由此引起的開銷。

  6. Link6再次沒有幫助。

編輯1:

我剛纔讀this外觀極好回答這表明使用Entity這在UI如果可能的話。它仍然不適用於我的大部分項目。

編輯2:

另一個優秀post建議去映射雙向,因爲我現在做的事情。它仍然沒有提出一種最小化開銷的方法。

+0

...所以,我(團隊)投入了太多時間來映射數百個對象。並創建一個域。它似乎在工作......只是將它從服務器移動到用戶界面並返回......而許多人相互保證 - 重新映射到DTO就是方式......我不明白。即使使用automapper ..集合/參考將是挑戰。儘管很少覆蓋Newtonsoft.Json(解析器,實體和數組值解析器)......而JSON序列化/反序列化正在解決所有問題。沒有DTO,沒有新的對象...只管理JSON-ification ... –

回答

-1

案例1:DAL(實體) - > BLL(DTO):

NHibernate的需要聲明我的實體的屬性作爲virtual懶加載的情況。請參閱thisthis。所以,我們可以假設NHibernate爲實體做了一些事情(爲延遲加載創建代理等),並且我們更好地嘲笑它。更好的是我們將實體轉換爲DTO。然後,我們可以以任何我們想要的方式使用DTO。當然,缺點是需要額外的編碼和維護。

案例2:BLL(DTO) - > ApplicationComponent(視圖模型)

正如我們已經斷開NHibernate的(通過複製實體到DTO)以上,我們可以自由地重用DTO傳遞數據查看。所以,只要有可能,我們可以重用DTO。如果不可行,我們可以創建新的ViewModel並將其映射到DTO。

很多互聯網上的帖子強烈建議爲每個視圖創建新的ViewModel。雖然我在概念上同意這一點,有我提到的維修問題。

這仍然分離了關注點,並且還允許在適用的情況下重用類。

編輯1:

我發現this優秀文章。它建議分離實體並在虛擬機中使用它。儘管我不同意在虛擬機中使用實體,但我可以繞過DTO使用這個技巧。問題是延遲加載數據。由於實體不知道VM需要什麼確切的數據,所以在分離實體之前應該加載所有數據。唯一的辦法是急切地加載所有的數據,這也不是一個好方法。