2014-06-20 131 views
2

在實體框架中,這兩個術語都用於DTO和代理對象。我很困惑,如果DTO被用來傳輸狀態,那麼爲什麼使用這個代理對象呢?C#中的DTO(數據傳輸對象)和代理對象之間的差異

+0

你讀這個'ProxyObject'的背景是什麼?順便說一下,你真的不應該使用帶EF的DTO。 – Aron

+0

其實我正在使用webmodel並使用automapper將webmodel映射到實體類。然後,當我保存實體如何能夠從我已映射到實體的Web模型中獲取生成的id(自動遞增)。那麼是DTO模式還是什麼? – user3603255

回答

3

代理對象是從模型類繼承的對象,但添加了一些功能,如狀態管理。這通常用於使您的模型不必從任何特殊類繼承。

數據傳輸對象是不是來自您的模型的對象,但它們表示相同的數據。您通常使用它們與不知道模型的服務進行通信。

2

DTO和代理對象不是EF概念,而是一般概念。

DTO或「數據傳輸對象」,是專門爲在應用程序的層或服務之間移動數據而創建的對象。使用DTO有幾個原因,但大多數情況下,層或服務之間所需的信息不同。例如:

  • 你有很多性質的實體和服務客戶​​端或其他層只需要其中的幾個:創建一個DTO具有所需性能,原廠原包,從原來的實體的映射DTO,並在服務/圖層上公開DTO。

  • 您需要公開具有來自不同實體的屬性的對象:創建具有所有必需屬性的DTO,將屬性從實體映射到DTO並將其公開。例如,您可能需要一個具有EF實體屬性的扁平對象和與其相關的「主表」(例如與FK相關的描述或名稱)

  • 您需要暴露具有不同形狀的實體,數據或任何其他變化......

您可以通過多種方式實現映射:例如創建一個DTO構造函數接受原來的實體作爲參數,與映射的靜態方法創建一個靜態類。使用諸如ValueInjecterAutoMapper之類的東西,可以使映射更容易一些。有時甚至可以直接使用它們,而無需執行任何其他事情來進行映射。但是,如果映射有點複雜,通常必須手動進行一些映射。

代理對象是完全不同的東西。 Literraly是表示另一個對象的對象。即,基本上與原始對象相似但與之不同的對象。這通常是爲了向對象添加額外的功能,保持它與原始意圖兼容。例如,可以代理一個對象來攔截方法調用以進行登錄或驗證。通常的技術是使用從原始對象動態繼承的框架,添加所需的行爲(這是典型的technique of AOP)。

在實體框架的情況下,您可以找到一個「更改跟蹤代理」的代理。這些對象是從原始實體動態繼承的對象,但添加了一些功能,可以讓它們跟蹤其變化:它們可以保存原始值,更改後的值,新狀態等。還允許它們實現延遲加載。 由於它們是原始對象的子類,它們具有相同的屬性,但具有不同的行爲。 Here is a short description of EF proxies

相關問題