ResourceProviderFactory периодическое обновление
Я создал пользовательский поставщик ресурсов, который возвращает строки из нашей базы данных, чтобы использовать их для чего угодно.
Проблема в том, что я не нашел способа "разорвать" кэш этих элементов и перезагрузить их из базы данных. В идеале я делал бы это каждые x минут или вручную, когда мы обновляем кеш и хотим его перезагрузить.
Технически это просто. Я храню все в хеш-таблице, так что просто обнулите это и перезагрузите при необходимости. Однако, поскольку ResourceProviderFactory обрабатывает загрузку каждого класса ресурса, и я не уверен, как перечислить созданные им классы.
Обзор кода:
public class ResourceProvider : IResourceProvider
{
private Dictionary<string, Dictionary<string, object>> _resourceCache
= new Dictionary<string, Dictionary<string, object>>();
private string _virtualPath;
private string _className;
public ResourceProvider(string virtualPath, string className)
{
_virtualPath = virtualPath;
_className = className;
}
public object GetObject(string resourceKey, CultureInfo culture)
{
...
}
}
public class ResourceProviderFactory :System.Web.Compilation.ResourceProviderFactory
{
public override IResourceProvider CreateGlobalResourceProvider(string classKey)
{
return new Cannla.Business.Resource.ResourceProvider(string.Empty, classKey);
}
...
...
}
То, что я планировал сделать, это добавлять ссылку каждый раз, когда вызывается CreateGlobalResourceProvider (например, добавить новый объект в коллекцию, а затем перечислить это и уничтожить все внутри этого объекта, когда мне нужно), но я не уверен, что это будет делать что-то странное для ResourceProviderFactory.
Есть ли какой-либо ResourceProviderFactory IEnumerable метод или что-то, что даст мне все эти объекты простым способом, прежде чем я начну создавать весь этот код?
1 ответ
Если вы можете использовать систему кэширования ASP.Net Просто используйте ее. Вы можете получить к нему доступ с помощью HttpRuntime.Cache и добавить временную аннулирование, проверьте пример ниже:
var Key = "Resources:" + ResourceType + ResourceKey + Cutlure.Name;
HttpRuntime.Cache.Insert(Key, ValueToCache,
null, DateTime.Now.AddMinutes(1d),
System.Web.Caching.Cache.NoSlidingExpiration);
Если вы не можете использовать систему кэширования ASP.Net
Вы можете поместить логику, которая вызывает аннулирование кэша внутри IResourceProvider. то есть. просто проверьте в GetObject, если срок действия кэша истек.