2009-02-04 268 views
2

實現DTO的最佳方式是什麼?如何有效地使用DTO對象(數據傳輸對象)?

我的理解是,它們是在對象之間傳輸數據的一種方式。例如,在ASP.Net應用程序中,可以使用DTO將代碼隱藏的數據發送到業務邏輯層組件。

其他選項怎麼樣,比如只是將數據作爲方法參數發送? (這是最簡單的方法,但是發送的數據較少?)

那麼,只保存數據,可以被其他對象(一種全局裝配數據存儲類)引用的靜態類呢? (這是否打破封裝太多?)

那麼每個傳輸使用一個通用的DTO呢?使用它可能會有點麻煩,但會減少需要處理的類的數量(減少對象混亂)。

感謝您分享您的想法。

回答

0

感謝所有有益的想法...

摘要+我拿到這個:

- - 如果有移動數據量小,並沒有太多的地方來移動它,常規參數可能就足夠了

- 如果有大量數據和/或許多對象將其移動到,則特殊創建的對象可能是最簡單的(DTO對象)。

- 一個可以被各種對象引用(而不是傳遞)的全局數據對象似乎會被壓在...但是,我想知道在某個特定的子對象中是否有時候沒有它的位置,系統?這是減少數據傳遞量的一種方法。它確實推動了「良好的封裝」的限制,但是在特定層次的特定情況下,它可能會增加簡單性到一個特定的類。因此,可能會丟失類級別的封裝,但仍可能具有組裝級封裝。

3

我保持簡單,並將一個DTO類映射到一個數據庫表。它們很輕便,所以我可以將它們發送到任何地方,包括通過電線。

10

我用DTO對:一個標準的3層應用程序的用戶界面和服務層的之間

  • 傳遞數據。
  • 傳遞數據作爲方法參數來封裝大量(5+)參數。

'one DTO to rule them all'approach can messy,best bet is to with specific DTO's for each feature/feature group,care to named them,so they can easily match to the features他們用於英寸

我從來沒有見過你提到的方式靜態DTO的,並會猶豫在創建像你所描述的DTO單身人士。

2

我認爲使用DataSet/DataTable作爲「一個DTO來統治它們」是很常見的。從數據庫中加載它們很容易,並將值保存起來,並且可以很容易地進行序列化。

我肯定會說他們使用起來比較麻煩。他們確實提供了所有的管道工作,但是對他們進行編程是一種痛苦(大量的鑄造,空白檢查,魔術字符串等)。看到一套很好的擴展方法可以讓它們更加「自然」一點,這將會很有趣。

1

DTO用於通過導線發送數據,而不是在對象之間發送數據。看看這篇文章: POCO vs DTO

+0

+1有幫助的鏈接 – Graeme 2012-08-24 20:02:59

3

我希望它可以很簡單。儘管DTO起源於系統的網絡分佈層,但如果域對象返回到「視圖」層,則可能存在整個負載問題。以下是其中的一些內容:

1.通過將Domain對象暴露給View層,Views可以瞭解域對象的結構,這使得視圖可以對有關對象的可用性做出一些假設。例如,如果一個域對象「Person」被重新調整到它被「綁定」的視圖,並且在其他視圖上,Person的「Address」將被綁定,那麼應用層會傾向於使用類似語義person.getAddresse()哪一個失敗,因爲在這一點上地址域對象可能還沒有被加載。實質上,隨着域對象變爲可用於查看圖層,視圖始終可以假設數據是如何可用的。 2.)當域對象綁定到視圖時(在胖客戶端中更是如此),那麼視圖中心邏輯會在這些對象內蠕變,從而使它們在邏輯上損壞。

基本上從我的經驗來看,使域對象可用於視圖會產生架構問題,但也存在使用DTO的問題,因爲使用DTO創建彙編程序(DTO到域對象和反向),像Patient域對象,Patient DTO等類似對象的增殖以及綁定可視的Patient Bean。

很明顯,在胖客戶端系統中沒有正確的答案。

我借這短暫的,不完整的,但真正的答案DTO從陳詞濫調:
http://www.theserverside.com/discussions/thread.tss?thread_id=32389#160505

相關問題