Asp.net-Mvc
領域實體、DTO 和視圖模型
我有一個帶有 POCO 域模型和 NHibernate 儲存庫層的 ASP.NET MVC 2 應用程序。我的域模型不知道我的視圖模型,所以我使用自動映射器從視圖模型轉到實體,反之亦然。
當我將 WCF 引入我的項目(後期要求)時,我開始不得不處理斷開連接的對象。也就是說,我使用 NHibernate 從數據庫中檢索一個實體,一旦該實體被序列化,它就會斷開連接,並且無論我是否打算使用它,都會載入每個子集合,這意味著我正在做很多不必要的數據庫工作。
在閱讀完這篇文章後,我發現強烈建議您不要在域項目之外公開您的實體,而應該使用 DTO。
我明白了這個原因,但我無法弄清楚如何實現它。
我是否在 ASP.NET MVC 中從 viewmodel 映射到 DTO,通過服務層發送 DTO,並從 DTO 映射到服務層中的實體?我應該在哪裡定義我的 DTO?
我喜歡讓我的服務層將實體封裝在其中,並且只返回/接收 DTO。我將服務契約以及 DTO 保存在一個單獨的程序集中,MVC 項目和服務實現都參考了該程序集。
在服務呼叫實現中,服務將 dto 映射到實體,然後根據需要與儲存庫和其他實體進行互動。
在 app/mvc 項目中,我有時會變得懶惰,只使用 DTO 作為某些操作的模型(尤其是 CRUDy 操作)。如果我需要投影或類似的東西,那麼我將製作一個視圖模型並使用自動映射器等在 DTO 和視圖模型之間進行轉換。
您的實體的暴露程度是一個備受爭議的話題。有些人會將它們一直推送到視圖/應用程序層。我更喜歡將它們保留在服務層中。我發現當實體離開服務層時,您會發現自己在與之互動的任何地方都在做業務邏輯類型的東西,這些東西可能應該駐留在服務中。