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, если срок действия кэша истек.

Другие вопросы по тегам