2011-05-12 58 views
3

根據www.dofactory.com和www.blackwasp.com,虛擬代理用於呈現複雜對象的簡化版本。只有在需要對象的細節時,實際上纔會填充主對象,從而提供一種延遲加載的形式。這意味着什麼時候使用使用延遲加載,我們可以稱之爲虛擬代理?除了當我們使用昂貴的物體時,除了其他原因外,我們還應該使用它嗎?我沒有生動地看到它。有人可以給出一個很好的解釋嗎?什麼是虛擬代理?

+1

我會說虛擬代理的好用非常少見。大多數代理不是虛擬的或緩存的部分原因是這種策略增加了複雜性。 – 2011-05-12 07:41:08

+0

@PeterLawrey你有沒有實現過數據映射器和延遲加載?有了數據映射器,你實際上永遠不會使用延遲加載? – 2012-02-06 08:44:09

+0

我已經實施了虛擬代理和沒有虛擬代理。我傾向於使用生成代碼而不是代理來生成代碼。相反,我傾向於使用虛擬代理(通過模擬庫)進行測試。虛擬代理比較省力。 – 2012-02-06 08:56:56

回答

2

我從來沒有覺得有必要這樣做,但你可以使用虛擬代理lazily initialize expensive object graphs。但是,你應該很少需要這樣做。

+0

這意味着你從未使用過懶加載?您總是從數據映射器獲取完整的對象圖(僅適用於所需的數據)? – 2012-02-06 08:42:18

+1

懶惰加載導致N + 1問題,所以我避免它。更好地明確你所提取的內容。 – 2012-02-06 10:59:28

+0

對我而言,創建一些數據庫表連接並將其與另一個select/join合併(然後填充對象)有時會更快(或更快)。在這種情況下,如果代理被實現,它可以避免第二個查詢合併,因爲它已經存在於代理中(在分離的查詢上執行的關係)。你有沒有想過這種情況?在這種情況下,沒有任何問題,因爲查詢分隔正是由於性能和響應時間。在深入探究@PeterLawrey上述說法(quest.comment)之前,這也值得作爲一種測試方法。 – 2012-02-08 12:44:13