2008-11-08 50 views
8

我想知道所有這些如何協同工作。我知道DTO基本上只是一個數據容器,用於域對象來回傳遞給表單等。 Domain對象是否包含一個DTO或者執行DTO和Domain Object是否擁有所有將手動映射的相同屬性?數據傳輸對象,域對象和知識庫

如果我在服務中公開我的DTO類型,如何在不爲客戶端上的每個get/set操作創建往返的情況下使用getters和setter?我知道你可以有一個很長的構造函數,但是如果你有7個以上的屬性,那麼這個構造函數會變得很難看。

當實現存儲庫模式時,我傳入DTO還是域對象?

回答

4
  • DTO's和Domain對象應該是分開的。
  • 應該有一個映射器將DTO映射到域對象和域對象映射到DTO。這個映射器應該是一個接口的實現,默認映射器使用反射來將對象映射到彼此。
  • 存儲庫應該是一個返回本身應該服務的域對象的服務。
  • 如果DTO是由Web服務公開的類,則創建的WSDL將該屬性定義爲一個元素,而在另一側創建的代理僅創建一個在其上運行的getter/setter屬性客戶端本身,所以獲取者和制定者不會導致往返。
  • 即使您只是在您的DTO中創建一個公共變量,代理將作爲getter和setter來實現。
1

我認爲最好讓DTO包含對Domain對象的引用,以便DTO的使用者可以開始使用Domain對象。也就是說,如果DTO的使用者不能改變Domain對象,則可能需要讓DTO包含封裝在Domain對象中的值。這可能很困難,因爲您可能需要執行Domain對象的深層副本。

我不確定爲什麼將DTO類型作爲服務公開會導致使用其getter/setter來執行往返操作的問題。如果該服務是遠程服務,則無論如何將返回的DTO序列化,並且您的getter/setter將獲得這些值的副本。如果服務不是遙遠的,由於客戶端和服務處於相同的進程空間,因此執行「往返」似乎沒有太大的損失。