在Web应用程序中,我有一项服务使用注入的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&值)
如Microsoft文档中所述,它表示:
内存缓存可以存储任何对象;分布式缓存 接口仅限于byte []。
问题
我在做什么错?我不明白当我应该缓存string
的列表时,为什么缓存期望返回Entity
。
答案 0 :(得分:2)
我怀疑您在代码中的某个位置将string
值添加到了与此处使用的tenantId
相同的缓存中。
请记住,m_memoryCache
实例已在您的整个代码中使用。