2016-09-26 76 views
0

我有一個WCF服務需要訪問信息的只讀存儲庫。這個存儲庫創建起來很昂貴,這意味着它需要創建一次並在服務調用/服務類的實例之間共享。一般來說,讓類線程安全並不是一個問題,也不會使存儲庫線程安全。我在考慮兩個選項共享程序存儲庫:在WCF共享只讀數據 - 選擇InstanceContextMode

  1. 只需設置「InstanceContextMode」到「一」和「ConcurrencyMode」到「多」,手動創建一個服務對象,並且在單個存儲庫注入到它通過構造函數。

  2. 使用「InstanceContextMode」設置爲「PerCall」(或「PerSession」)和執行我的服務定製服務實例提供。作爲創建過程的一部分,此實例提供程序可以將單個實例的存儲庫注入所有服務類實例(構造函數)。

根據我的情況(假設我已經提交了足夠的信息),不使用選項1的原因是什麼?對我來說,它似乎是最簡單的?我一直在閱讀將「InstanceContextMode」設置爲「Single」對性能/可伸縮性不利,但我無法理解這是否始終如此,或者是否取決於服務屬性。

如前所述我意識到這可能是我還沒有提供關於我的任何的您特定的情況下足夠的信息能夠回答。

最好的問候, 約翰

回答

0

WCF服務需要訪問信息的只讀存儲庫。這個倉庫是昂貴的創建,這意味着它需要創建一次和服務調用之間共享/服務類

上述場景更容易,你必須使用一個緩存機制,而不是案件的情況下,你必須使用「InstanceContextMode」的情況。

所以,你應該能夠通過使用MemoryCache實現這一目標。您可以將只讀對象加載到內存緩存中,並安全地在併發Web服務調用中共享它們。

+0

感謝您的回答!這聽起來像是一個很好的選擇,並且與解決方案#2(多個實例)具有相同的主題。但是,如果#1是一個不好的解決方案,並且如果是:爲什麼?對我來說,瞭解這一部分非常重要。 –

+0

在我看來,#1不好,因爲它使你的服務單線程化。如果您在API中使用此模式,可以通過多個系統或設備訪問該模式,您的Api將幾乎不可用。根據MSDN,_Single:每個實例上下文一次最多允許在實例上下文中有一個線程處理消息。希望使用相同實例上下文的其他線程必須阻塞,直到原始線程退出實例上下文._ –

+0

這不是對「ConcurrencyMode」的描述以及該設置的選項「Single」嗎?在#1中,我打算使用設置爲「Multiple」的「ConcurrencyMode」和設置爲「Single」的「InstanceContextMode」。對我來說,這意味着將使用單個對象來服務所有服務調用,並且該單個對象將由多個調用併發使用。這當然要求線程同步。 –