В текущей реализации IMemoryCache
интерфейс имеет следующие методы:
bool TryGetValue(object key, out object value);
ICacheEntry CreateEntry(object key);
void Remove(object key);
У нас есть возможность запросить кэш для записи следующим образом:
//first way
if (string.IsNullOrEmpty
(cache.Get<string>("timestamp")))
{
cache.Set<string>("timestamp", DateTime.Now.ToString());
}
//second way
if (!cache.TryGetValue<string>
("timestamp", out string timestamp))
{
//
cache.Set<string>("timestamp", DateTime.Now.ToString());
}
Но есть другой метод, который должен делать то, что должен делать кеш (GetOrCreate
) с заводским параметром:
public static TItem GetOrCreate<TItem>(this IMemoryCache cache, object key, Func<ICacheEntry, TItem> factory)
{
object obj;
if (!cache.TryGetValue(key, out obj))
{
ICacheEntry entry = cache.CreateEntry(key);
obj = (object) factory(entry);
entry.SetValue(obj);
entry.Dispose();
}
return (TItem) obj;
}
Как вы можете видеть выше, метод Set
принимает MemoryCacheEntryOptions
или любые даты absoluteExpirationRelativeToNow
, absoluteExpiration
и т. Д. (https://github.com/aspnet/Caching/blob/12f998d69703fb0f62b5cb1c123b76d63e0d04f0/src/Microsoft.Extensions.Caching.Abstractions/MemoryCacheExtensions.cs),, но метод GetOrCreate
не поддерживает этот тип ' per-entry-expiration-date ', когда мы создаем новую запись.
Я пытаюсь выяснить, упускаю ли я что-то или мне нужно сделать PR, чтобы добавить эти методы.
Приложение:
public static ICacheEntry SetValue(this ICacheEntry entry, object value)
{
entry.Value = value;
return entry;
}
Открыл здесь вопрос: https://github.com/aspnet/Caching/issues/392, чтобы получить больше отзывов.