2012-08-27 38 views
3

建議在wcf應用程序中使用單例模式嗎?我有ServiceResponse類,它將負責處理響應和errordetail以及wcf當前請求的幾乎所有細節。當我第一次打這個服務時,讓我們說我在ServiceResponse類中有5個屬性,並且在errordetail屬性中填充了各自的值和一些錯誤細節。對於下一個命中,讓我說我沒有得到任何錯誤的細節和所有其他4個屬性填補了。wcf中的單例模式

但是,這裏的東西是,errordetail屬性仍然填充了以前的值,我假設即使在後續命中後,單身對象也不會創建。所以只有變化的值受到影響,但未觸及的屬性仍然保持之前的值。

是因爲appdomain永遠不會卸載釋放該對象以允許爲其他imm創建下一個sinleton對象。請求?否則,如何在wcf中實現單例模式。感謝幫助。

+0

你的意思是在你的服務中注入一個單例,例如爲緩存,或者你的意思是使用InstanceContextMode = Single(http://msdn.microsoft.com/en-us/magazine/cc163590.aspx) – StuartLC

回答

3

單例模式意味着該對象僅實例化一次,並且在AppDomain的整個生命週期中都存在。您不應將特定於請求的數據存儲在靜態對象中,因爲它們都將共享相同的數據,這些數據可能不是您正在查找的數據。

無論是在WCF應用程序中使用靜態對象是個好主意,這個問題完全取決於您的場景以及您需要在其中存儲的內容。由於WCF是一個多線程環境,多線程可以訪問這個共享數據,所以您必須格外小心,通過使用適當的同步機制來確保這些數據是線程安全的。

是因爲應用程序域永遠不會卸載到釋放對象 允許獲取其他IMM創建的下一個對象sinleton。 請求?

在應用程序啓動時會創建一個AppDomain。不要期望在每個請求上獲得不同的AppDomain。請求將全部從相同的AppDomain提供,直到應用程序被IIS回收爲止。

0

...幾乎所有wcf當前請求的詳細信息。

這不是一個單身人士。每個定義的單例將在所有請求之間共享。你想創建一個貫穿整個請求或連接上下文的實例。首次創建對象的實例並將其存儲在相關的請求/連接緩存中。