分布式應用架構中的數據傳輸對象(DTO)
Written by: Rickie Lee
Dec. 1, 2004
在分布式架構中,相關(guān)層在物理部署上實(shí)現分離,通過(guò)網(wǎng)絡(luò )或跨進(jìn)程調用遠程對象或服務(wù)。在這種分布式架構中,需要定義有效的數據傳輸對象(Data Transfer Object, DTO)來(lái)實(shí)現層與層之間的數據傳輸。
因為遠程調用需要跨越網(wǎng)絡(luò )或進(jìn)程,因此會(huì )比較慢。通過(guò)使用DTO,在單一遠程調用中傳輸更多的數據信息,減少遠程調用的次數,提高分布式調用的性能。
下面分析一些比較常用的數據傳輸對象(DTO):
1.DataSet
DataSet是緩存在內存中的表,它是從關(guān)系數據庫或 XML 文檔中獲得的??梢允褂?/span> DataSet來(lái)表示從數據庫中檢索到的業(yè)務(wù)實(shí)體數據,然后可以在層與層之間使用DataSet來(lái)傳遞數據。Microsoft提供的范例Duwamish 7.0中使用大量的DataSet來(lái)實(shí)現層與層之間的數據傳遞,如Presentation層與BusinessFacade層等等。
優(yōu)點(diǎn):(1)DataSet類(lèi)由.Net Framework內置實(shí)現,不必編寫(xiě)和維護額外的類(lèi)。(2)DataSet可以與Windows Form和Web Form的內置控件直接交互,如DataGrid等。(3)DataSet支持序列化XML,不僅包括內容序列化,還包括Schema。(4)非連接的數據模式。(5)DataSet 可以包含數據的集合,能夠表示復雜的數據關(guān)系。
缺點(diǎn):(1)互操作性問(wèn)題,因為DataSet類(lèi)是ADO.NET提供的,因此要求Client端在.Net Framework平臺上運行。(2)陳舊的數據,因為DataSet包含的數據是Database的快照,如果Database的數據經(jīng)常改變,則不推薦采用DataSet。(3)依賴(lài)Database schema,訪(fǎng)問(wèn)DataSet中數據時(shí),要求顯式指定字段類(lèi)型和數據表之間的關(guān)系,如果Database schema發(fā)生變化,相應的code也要變化。要訪(fǎng)問(wèn) DataSet 中的表,客戶(hù)端代碼必須使用整數索引生成器或字符串索引生成器來(lái)索引 DataTable 集合。要訪(fǎng)問(wèn)特定列,必須使用列編號或列名稱(chēng)索引 DataColumn 集合。(4)缺乏類(lèi)型安全,當從DataSet中取值時(shí),需要顯式指定要轉換的數據類(lèi)型,這樣容易產(chǎn)生錯誤。(5)性能問(wèn)題。實(shí)例化和封送處理 DataSet 會(huì )增加運行時(shí)負擔。
2.有類(lèi)型的DataSet
有類(lèi)型的DataSet是從 ADO.NET DataSet 類(lèi)繼承而來(lái)的類(lèi),包含具有嚴格類(lèi)型的方法、屬性和類(lèi)型定義以公開(kāi) DataSet 中的數據和元數據的類(lèi)。
優(yōu)點(diǎn):除了上述DataSet的部分優(yōu)點(diǎn)外,有類(lèi)型的 DataSet 還提供了數據驗證支持(在編譯時(shí)進(jìn)行類(lèi)型檢查,無(wú)效的表名稱(chēng)和列名稱(chēng)將在編譯時(shí)而不是在運行時(shí)檢測),并且簡(jiǎn)化代碼的編寫(xiě),提高代碼的可讀性。
缺點(diǎn):(1)具有DataSet的大部分缺點(diǎn),除了提供類(lèi)型安全。(2)另外,需要編寫(xiě)或維護用來(lái)描述typed interface的XML Schema,不過(guò)幸好VS.Net IDE提供工具支持。(3)部署問(wèn)題。必須將包含有類(lèi)型的 DataSet 類(lèi)的程序集部署到使用業(yè)務(wù)實(shí)體的所有層。(4)可擴展性問(wèn)題。如果修改了數據庫架構,則可能需要重新生成有類(lèi)型的 DataSet 類(lèi)以支持新架構。重新生成過(guò)程將不會(huì )保留在有類(lèi)型的 DataSet 類(lèi)中實(shí)現的任何自定義代碼。必須將包含有類(lèi)型的 DataSet 類(lèi)的程序集重新部署到所有客戶(hù)端應用程序中。
有類(lèi)型的方法和屬性的提供使得使用有類(lèi)型的 DataSet 比使用通用 DataSet 更方便。使用有類(lèi)型的 DataSet 時(shí),IntelliSense 將可用。有類(lèi)型的 DataSet 的實(shí)例化和封送處理性能與通用 DataSet 基本相同。
3.自定義業(yè)務(wù)實(shí)體(Business Entity)
這是一種自定義類(lèi),用于表示各種業(yè)務(wù)實(shí)體類(lèi)型??梢远x保存業(yè)務(wù)實(shí)體數據的字段,并定義將此數據向應用程序各層中公開(kāi)的屬性(getter/setter),或者進(jìn)一步使用在該類(lèi)中定義的字段來(lái)定義方法以封裝簡(jiǎn)單的業(yè)務(wù)邏輯。
應當封裝應用程序的功能的核心業(yè)務(wù)實(shí)體,而不是為每個(gè)表定義單獨的業(yè)務(wù)實(shí)體。
優(yōu)點(diǎn):(1)可維護性,更改架構一般不會(huì )影響數據訪(fǎng)問(wèn)邏輯組件方法簽名。(2)相對DataSet而言,有更好的性能。(3)編譯期間提供類(lèi)型安全檢測。(4)代碼易讀。要訪(fǎng)問(wèn)自定義實(shí)體類(lèi)中的數據,可以使用有類(lèi)型的方法和屬性。(5)自定義實(shí)體可以包含方法以封裝簡(jiǎn)單的業(yè)務(wù)規則。(6)本地化驗證。自定義實(shí)體類(lèi)可以在其屬性存取器(getter/setter)中執行簡(jiǎn)單的驗證測試以檢測無(wú)效的業(yè)務(wù)實(shí)體數據。(7)專(zhuān)用字段??梢噪[藏不希望向調用程序公開(kāi)的信息。
缺點(diǎn):(1)需要編寫(xiě)并維護自定義DTO類(lèi)。(2)自定義實(shí)體表示的是單個(gè)業(yè)務(wù)實(shí)體,而不是一個(gè)業(yè)務(wù)實(shí)體集合。要保存多個(gè)業(yè)務(wù)實(shí)體,調用應用程序必須創(chuàng )建一個(gè)數組或一個(gè) .NET 集合。(3)必須在自定義實(shí)體中實(shí)現自己的序列化機制??梢允褂脤傩詠?lái)控制實(shí)體組件的序列化方式,也可以通過(guò)實(shí)現 ISerializable 接口來(lái)控制自己的序列化。(4)部署問(wèn)題。必須在所有物理層部署包含自定義實(shí)體的程序集。(5)可擴展性問(wèn)題。如果修改了數據庫架構,則可能需要修改自定義實(shí)體類(lèi)并重新部署程序集。
4.簡(jiǎn)單標量參數列表
根據需要傳入的參數,傳入一系列簡(jiǎn)單的標量值。
優(yōu)點(diǎn):(1)標量值本身支持序列化。(2)內存使用效率高,標量值只傳遞實(shí)際調用需要的數據。(3)更高的性能。(4)最明顯的特點(diǎn)是簡(jiǎn)單方便。
缺點(diǎn):(1)緊密耦合與維護。架構的更改可能需要修改方法簽名,這會(huì )影響調用代碼。(2)有可能存在進(jìn)行多次單獨的方法調用,這在分布式環(huán)境中會(huì )給性能帶來(lái)很大影響。(3)難以表達復雜的數據關(guān)系。
當然,在實(shí)際的分布式應用系統中,會(huì )根據實(shí)際情況的要求,使用不同的DTO對象。
下面通過(guò)描述簡(jiǎn)單的分布式應用架構模型設計,來(lái)演示DTO對象在層與層之間的數據傳遞和交互:

聯(lián)系客服