В моем веб-приложении у меня есть одна из моих служб, которая использует внедренную IMemoryCache
:
public class InternalService
{
private readonly IMemoryCache m_memoryCache;
private readonly MemoryCacheEntryOptions m_cacheEntryOptions;
public Service(IMemoryCache memoryCache)
{
m_memoryCache = memoryCache;
// Set cache options: keep in cache for this time, reset time in 1 hour, no matter what.
m_cacheEntryOptions = new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromHours(1d));
}
}
В этой службе я использую кэш, чтобы избежать дорогостоящего вызова.Вызов возвращает список сущностей:
public class Entity
{
public long Id {get; set;}
}
Вот метод в Сервисе, который имеет дело с кешем:
private async IList<Entity> GetEntitiesAsync(string tenantId)
{
if (false == m_memoryCache.TryGetValue(tenantId, out IList<Entity> tenantEntities) || tenantEntities.Count == 0)
{
// Do the expensive call.
IList<Entity> tenantEntities = await ExpensiveServiceCallAsync(tenantId);
m_memoryCache.Set(tenantId, tenantEntities , m_cacheEntryOptions);
}
return tenantEntities;
}
Однако он выдает следующее исключение:
System.InvalidCastException: невозможно преобразовать объект типа «System.String» в тип «System.Collections.Generic.IList`1 [Entity] '.в Microsoft.Extensions.Caching.Memory.CacheExtensions.TryGetValue [TItem] (кэш IMemoryCache, ключ объекта, TItem & value)
Как указано в документации Microsoft, в нем говорится, что:
Кэш в памяти может хранить любой объект;интерфейс распределенного кэша ограничен байтом [].
Вопрос
Что я делаю не так?Я не понимаю, почему кеш ожидает возврата string
, когда я должен был кешировать список Entity
.