2009-04-08 47 views
7

爲什麼我應該使用DTOs/Domain對象,只需將所有業務類放入類庫中,在業務邏輯中使用它們,然後將這些相同的業務對象傳遞給邊界類?數據傳輸對象(DTO)的要點是什麼?

更新: 所有是偉大的觀點,感謝您的幫助。後續問題:

你通常在哪裏放置這些DTO?除了Domain對象之外,即在同一個命名空間中?

namespace MedSched.Medical 
{ 
    public class MedicalGroup 
    { 
     //... 
    } 

    public class MedicalGroupDTO 
    { 
     //... 
    } 
} 

回答

7
  • 的DTO的爲您的域模型的抽象層。因此,您可以更改模型並且不違反您爲服務客戶提供的合同。這類似於數據庫設計中的常見做法,其中視圖和過程成爲基礎數據模型的抽象層。
  • 序列化 - 您可能會過度暴露數據並通過線路發送臃腫消息。這可以通過使用序列化屬性來緩解,但是您可能仍然有額外的信息。
  • 隱式與顯式合同 - 通過暴露域對象,您可以將其留給客戶來解釋他們的使用情況,因爲他們沒有完整的模型供他們使用。您經常會根據關聯的存在或刪除情況隱式更新域對象,或者盲目接受所有更改。 DTO明確表達了服務的使用和所需的操作。
  • 斷開連接的場景 - 有明確的消息或DTO的會使你更容易實現消息和消息模式,例如消息代理等
  • DDD - 純DDD要求該域對象是不可改變的外部,因此,你必須卸載這到另一個對象,通常是一個DTO。
3

DTO的是數據傳輸對象,與轉移是關鍵字。如果你的應用程序不是基於web服務的,那麼DTOs aren()就不會有效,因爲它們是「輕量級的」(即沒有業務邏輯)。

如果你的應用程序不是基於web服務的,真的不想給你買東西。

所以決定使用還是不使用DTO應該基於您的應用程序的體系結構。

+0

有意義 - 是的,特定的應用程序是一個高度分佈的應用程序。感謝您的意見。 – Aaron 2009-04-08 00:14:28

1

有些時候,您要傳遞的數據沒有完全映射到業務對象的結構,在這種情況下您使用DTO。例如:當你想傳遞數據或投影的一個子集時。

4

我能想到的2個基本情景使用的DTO:

  • 您正在從數據業務對象那是不完整的,將無法通過驗證。例如,您正在解析創建業務對象的CSV文件或Excel文件。如果直接從這些對象中使​​用數據來創建業務對象,則很可能會在對象中失敗多個驗證規則,因爲來自這些文件的數據容易出錯。他們也傾向於在最終的業務對象中擁有不同的結構:爲這些不完整的數據設置佔位符將會很有用。

  • 您正在通過帶寬密集的媒介傳輸業務對象。如果您使用的是Web服務,則需要在運輸之前使用DTO來簡化對象;否則CLR將很難嘗試序列化所有數據。

相關問題