Справочная информация:
Я задал этот вопрос о создании кэшированной структуры провайдера для моей службы 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 довольно полезен, и он показывает, что каждый вызов службы выполняется в своем собственном уникальном процессе (т. Е. Он имеет уникальный идентификатор процесса).Таким образом, провайдеры никогда не будут кэшироваться.Как я могу получить это, чтобы фактически кэшировать провайдеров, и читать этот словарь через процессы?Это вообще возможно?
Я также читал подобные вопросы к этому здесь на SO, и я замечаю настройку InstanceContextMode .Я не думаю, что хочу этого, потому что я думаю, что это снизит производительность (я ошибаюсь? Не так?) В ореховой оболочке я хочу разделить _providerDictionary среди всех процессов / экземпляров службы... пожалуйста, помогите!