#c# #asp.net-core #memorycache
#c# #asp.net-core #кэш памяти
Вопрос:
.Net Core 3.0. У меня есть репозиторий, в который вводится IMemoryCache. Репозиторий зарегистрирован как временный. Я бы хотел, чтобы кэш очищался / сбрасывался ПО запросу, однако этого не происходит. Он сохраняет данные, вставленные туда из предыдущего запроса. Как мне сделать так, чтобы кэш памяти создавался заново для каждого запроса?
public OrganizationRepository(
IMemoryCache cache)
{
m_cache = cache;
// cache still has data in entries for subsequent requests
}
Регистрации:
services.AddTransient<IOrganizationRepository, OrganizationRepository>();
Комментарии:
1. Я не знаю, почему вы используете IMemoryCache для хранения данных по запросу? Потому что кэш — это метод, который помогает уменьшить количество обходов базы данных во многих запросах, а не в одном конкретном запросе. Есть несколько методов, которые могут помочь в вашей ситуации, например, HttpContext. Элементы или запись вашего контекста с помощью пользовательского промежуточного программного обеспечения.
2. Кэш, вводимый по запросу, не имеет смысла. Для каждого запроса создается новый контроллер. Итак, что бы вы кэшировали внутри одного запроса?
3. @JohnathanLe, в моем случае я вставляю кучу строк (один запрос), я хотел бы хранить данные в кэше во время этого одного запроса / для каждого запроса. Я ищу «недолговечный кэш», следовательно, использование кэша для каждого запроса
4. @ShaneKm так что просто поместите их в HttpContext. Элементы и получайте, когда захотите. Кэш не вводится для использования в одном запросе, экземпляр кэша на самом деле является одноэлементным. Если HttpContext. Items не подходит для вашей идеи, просто напишите пользовательское промежуточное программное обеспечение, введите свой пользовательский контекст и добавьте столько, сколько захотите.
5. Я полагаю, что IMemoryCache зарегистрирован по умолчанию и всегда регистрируется как одноэлементный, в основном потому, что он, похоже, предназначен для такого использования. learn.microsoft.com/en-us/dotnet/api /… <- смотрите раздел «Осторожно» здесь.
Ответ №1:
Похоже, это работает:
services.AddScoped<MemoryCache, MemoryCache>();
затем введите его как кэш памяти
Ответ №2:
Вы можете легко написать свой собственный кэш памяти.
private readonly Dictionary<string, List<Product>> _localCache = new Dictionary<string, List<Product>>();
public async Task<List<Product>> LocalListAsync(bool invalidateCache = false)
{
const string cacheKey = "ProductList";
if (invalidateCache)
{
_localCache.Remove(cacheKey);
}
if (_localCache.TryGetValue(cacheKey, out var list))
{
return list;
}
await _products
.Include(x => x.ProductCategory)
.LoadAsync();
list = _products.Local.ToList();
_localCache.Add(cacheKey, list);
return list;
}