Почему в IMemoryCache TryGetValue выбрасывает InvalidOperationException? - PullRequest
0 голосов
/ 19 октября 2018

В моем веб-приложении у меня есть одна из моих служб, которая использует внедренную 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.

1 Ответ

0 голосов
/ 19 октября 2018

У меня есть подозрение, что где-то в вашем коде вы добавляете значение string в кеш с тем же tenantId, который вы используете здесь.

Помните, что экземпляр m_memoryCacheиспользуется во всем вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...