Dot-Net

在大型 .NET 項目中管理 DTO 和映射

  • July 6, 2011

我和我的團隊正在建構一個大型 .NET WinForms 應用程序。該應用程序使用各種“服務”從我們的數據庫中獲取數據。每個“服務”都存在於自己的解決方案中,並處理特定類型的數據。因此,例如,我們的“ContactsService”管理檢索/保存聯繫人到我們的數據庫。

通常,我們一直在為每個服務建構 DTO。因此,我們可能有一個“ContactDTO”,它對聯繫人上的每條數據都有簡單的字元串屬性。現在,我們還有一個業務層“Contact”類,它具有完全相同的屬性,也許還有一些帶有一些業務邏輯的額外方法。最重要的是,“ContactsService”有自己的 Contact 類,該類由 ContactDTO 補充。

管理我們所有的 DTO 和映射已經成為一個巨大的痛苦。目前,發送要儲存在數據庫中的聯繫人如下所示:

  • 將客戶聯繫人映射到 ContactDTO
  • 將 ContactDTO 映射到服務聯繫人
  • 保存聯繫人
  • 地圖服務 Contact to ContactDTO
  • 將 ContactDTO 映射到客戶聯繫人

這只是感覺很糟糕。如果我們向客戶的 Contact 類添加一個屬性,我們必須在 3-4 個位置添加屬性和映射。

我們做錯了什麼,我們怎樣才能讓我們的生活更輕鬆?使用 Json.NET 之類的東西並擁有 JSON DTO 會更簡單嗎?我們檢查了 AutoMapper,但一些團隊成員認為它太複雜了。

我遇到過很多這樣的問題,但就我而言,我選擇接受它,因為使用 DTO 的決定是有意的——我希望我的服務、客戶端、代理和契約程序集完全分開。

使用 WCF 時,我喜歡的佈局是這樣的(使用您的聯繫人範例):

  • 客戶端組裝

    • 聯繫人(具有客戶特徵)
  • 共享契約組裝

    • 聯繫人(商定的通用 DTO)
  • 代理程序集

    • 使用共享契約程序集中的聯繫人
  • 服務組裝

    • 聯繫人(具有服務-y 業務邏輯特徵,例如,這可能是由 ORM 層(如實體框架)公開的類型)

我現在共享服務和客戶之間的合​​同。如果我需要獨立地對它們進行版本控制,那麼我只需複制共享的 Contracts 程序集並重新定位 Proxy 程序集以使用該副本,然後獨立修改兩個 Contracts 程序集。但在我工作過的大多數情況下,我同時擁有客戶端和服務,因此在兩者之間共享 Contracts 程序集很方便。

當您做出架構決策以使用 DTO 隔離組件時,這是我能想到的唯一優化,至少不使用程式碼生成工具(我不知道有什麼好的工具,但不必研究它們) .

編輯:不使用 WCF 時,您顯然不需要“代理”程序集。

引用自:https://stackoverflow.com/questions/6601483