亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我們可以只使用 DTO 而不是 ViewModel 嗎?

我們可以只使用 DTO 而不是 ViewModel 嗎?

C#
PIPIONE 2021-07-06 17:48:00
我們目前使用 DTO 進行 Web API 請求和響應并使用 ViewModel 將數據傳遞給 MVC 中的 View目前,我們有:DTO 作為一個單獨的項目ViewModel 位于 UI 項目中(與 Controllers 一起的另一個文件夾)我在我們的案例中看到的唯一區別是 DTO 必須通過線路傳遞并作為 JSON 發送,而 ViewModel 必須在視圖內部傳遞才能呈現為 HTML。我們應該為 MVC 應用程序和我們的應用程序/其他客戶端維護單獨的傳輸對象,還是僅通過 DTO 來完成這兩項工作,即在 View 而不是 ViewModel 中傳遞 DTO?它可能有什么缺點?我在這里閱讀了很多回復,但沒有示例和令人信服的理由在我們的案例中保留單獨的 ViewModel 和 DTO。
查看完整描述

3 回答

?
DIEA

TA貢獻1820條經驗 獲得超3個贊

我可以分享我在項目中實施這種模式的經驗。將該項目視為分布式架構的簡單CRUD應用,分為三種方案:

  • Project.Web(MVC 應用程序)

  • Project.DTO(普通 C# 類)

  • Project.API(Web API 應用程序)

Project.Web 包含應用程序的 UI 邏輯,并且所有 CRUD 操作都依賴于 Project.API,因為與數據庫相關的操作是在 Project.API 中執行的。

現在來了 Project.DTO,它包含普通的 C# 類,用于來回傳輸數據。

Project.Web <---> Project.API

為了使其更具分布式,我創建了 Project.DTO 作為 Nuget 包并將其托管在 Artifactory(您可以使用 Nuget 或任何其他存儲庫)并使用 Nuget 包管理器使用它。這種方法的主要優點是 DTO 類始終是版本化的并且易于使用。

關于保持 View Model 和 DTO 分開的問題,我可以看到以下幾點支持它:

  • 從 API 到 Web 的數據傳輸,反之亦然:它可能很大而且很復雜。假設我的應用程序想要創建一個客戶端并將其所有詳細信息添加到數據庫中,例如客戶端地址、客戶端通信、客戶端歷史記錄等。在 Project.Web 中,我們可以擁有其他詳細信息,例如會話相關數據、需要的 UI 特定數據不需要從 Web 傳輸到 API。因此,創建一個單獨的 DTO 是有意義的,只傳輸 Web 和 API 通用的并且獨立于項目的數據。

  • 對 API 或 Web 的傳入請求:假設我已經創建了一個移動應用程序并準備使用 Project.API。如果我沒有創建單獨的視圖模型和 DTO,我應該將我的視圖模型公開給客戶端(移動應用程序),這是不可取的,因為它可能包含應該保密的敏感字段。

  • 關注點分離:保持 DTO 僅用于傳遞數據,對于應用程序中的任何其他進程,請使用 ViewModel。保持關注點分離原則。

這些是我能想到的與您的問題相關的幾點。


查看完整回答
反對 回復 2021-07-10
  • 3 回答
  • 0 關注
  • 357 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號