我問this question關於我的WCF服務創建緩存提供商結構。我現在已經實現了這個設計,但是我在測試中注意到的是提供者實際上並沒有被緩存。我怎麼知道這個?我添加以下調試級別日誌記錄我的服務:
private static readonly IDictionary<string, XmlLoaderProviderBase> _providerDictionary =
new Dictionary<string, XmlLoaderProviderBase>();
public void Load(LoadRequest loadRequest)
{
XmlLoaderProviderBase xmlLoader;
if (_providerDictionary.ContainsKey(loadRequest.TransferTypeCode))
{
// Use cached provider...
xmlLoader = _providerDictionary[loadRequest.TransferTypeCode];
Logger.Log.DebugFormat("Found cached provider: {0} for transfer type: {1}",
xmlLoader.GetType(), loadRequest.TransferTypeCode);
}
else
{
// Instantiate provider for the first time; add provider to cache...
xmlLoader = XmlLoaderProviderFactory.CreateProvider(loadRequest.TransferTypeCode);
_providerDictionary.Add(loadRequest.TransferTypeCode, xmlLoader);
Logger.Log.DebugFormat("Instantiating provider: {0} for transfer type: {1}",
xmlLoader.GetType(), loadRequest.TransferTypeCode);
}
xmlLoader.Load(loadRequest);
}
我注意什麼,就是不管多少次,我呼叫服務,提供者總是實例化(它永遠不會找到緩存的版本)。幸運的是,log4net是非常有用的,它顯示每個對服務的調用運行在它自己獨特的進程中(即它有一個唯一的進程ID)。因此,提供者將永遠不會被緩存。我如何才能實際緩存提供程序,並跨進程讀取該字典?這甚至有可能嗎?
我也讀上如此相似問題,這在這裏,我注意到InstanceContextMode設置。我不認爲我想要這樣做,因爲我認爲這會損害性能(我錯了嗎?)在堅果殼中,我希望跨越所有進程/服務實例共享所有進程/服務實例...請幫助!
WCF服務呼叫做_not_運行在單獨的進程。 – 2012-02-27 16:28:12
沒有靜態物體這樣的東西。您可以擁有靜態類和靜態成員 – 2012-02-27 16:39:21
@JohnSaunders - 我會以一美元購買它,但有幾件事情:1)連續調用服務時每次顯示不同的PID,以及2)檢查以查看如果提供者已經存在,則從未評估爲真。謹慎地闡述你的立場,併爲我提供更多的見解嗎? – Didaxis 2012-02-27 16:45:20