Dot-Net

將 DTO 映射到域對象的最佳實踐?

  • March 24, 2009

我見過很多與將DTO映射到域對象相關的問題,但我覺得他們沒有回答我的問題。我以前用過很多方法,也有自己的看法,但我正在尋找更具體的方法。

情況:

我們有很多領域對象。我們正在使用 CSLA 模型,因此我們的域對象可能非常複雜,並且它們包含自己的數據訪問權限。你不想在電線上傳遞這些。我們將編寫一些新服務,這些服務將以多種格式(.Net、JSON 等)返回數據。出於這個(和其他原因),我們還創建了一個精簡的數據傳輸對像以在網路上傳遞。

我的問題是:DTO 和 Domain 對象應該如何連接?

我的第一反應是使用Fowler,DTO 模式類型的解決方案。我已經看過很多次了,這對我來說是正確的。域對像不包含對 DTO 的引用。呼叫外部實體(“映射器”或“組裝器”)從域對象創建 DTO。通常在域對象端有一個ORM。這樣做的缺點是“映射器”對於任何實際情況都會變得極其複雜,並且可能非常脆弱。

提出的另一個想法是域對象“包含” DTO,因為它只是一個精益數據對象。域對象屬性將在內部引用 DTO 屬性,並且可以在需要時返回 DTO。我看不出這有什麼問題,但感覺不對。我看過一些文章,使用NHibernate的人似乎使用了這種方法。

還有其他方法嗎?以上方法之一值得使用嗎?如果是或不是,為什麼?

當您僅支持單個映射時,將映射器置於域和 DTO 之間的好處並不明顯,但隨著映射數量的增加,將該程式碼與域隔離有助於使域更簡單和更精簡。您不會因為過多的額外重量而使您的域混亂。

就個人而言,我嘗試將映射排除在我的域實體之外,並將責任放在我所謂的“管理器/服務層”中。這是一個位於應用程序和儲存庫之間的層,並提供諸如工作流協調之類的業務邏輯(如果您修改 A,您可能還必須修改 B,以便服務 A 可以與服務 B 一起使用)。

如果我有很多可能的結束格式,我可能會考慮創建一個可以使用訪問者模式的可插入格式化程序,例如轉換我的實體,但我還沒有發現需要如此復雜的任何東西。

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