Приведение типа объекта кэша Azure всегда имеет значение null

Это очень странно, поскольку невозможно преобразовать DataCacheItem в коллекцию списков.

я извлекаю значение из базы данных и сохраняю его в кеше, но если я прошу кеш вернуть данные с помощью TypeCast, он отказывается это делать.

Cannot cast 'isValueInCache' (which has an actual type of     
'Microsoft.ApplicationServer.Caching.DataCacheItem') to      
'System.Collections.Generic.List<MMD.Data.HumanGender>'


//Setting Value in Cache Object
var isValueInCache = BaseCache.Instance().RetrieveCacheValue("allGenders");

//TypeCasting of Data
var isSeariled = isValueInCache == null ? 
Newtonsoft.Json.JsonConvert.DeserializeObject(proxy.GetAllGenders(), 
typeof(List<HumanGender>)) as List<HumanGender>
: isValueInCache as List<HumanGender>;

я не понял, почему он не может преобразовать Object в List<T>. Мне кажется, здесь можно только обойти, отлить объект в формате JSON, вытащить по ключу и создать List Object.

Обновление 1:

этот случай относится не только к списку, но и к любому объекту сущности, который извлекается из кэша.

Обновление 2:

Также не работает с DTO.

Все еще ищу работу в этом.


person joshua    schedule 24.07.2013    source источник


Ответы (2)


Разве вы не должны использовать свойство value элемента кэша данных?

В настоящее время не за Visual Studio, поэтому я пишу это без компилятора.

var isValueInCache = BaseCache.Instance().RetrieveCacheValue("allGenders") as DataCacheItem;

//TypeCasting of Data
var isSeariled = isValueInCache == null ? 
Newtonsoft.Json.JsonConvert.DeserializeObject(proxy.GetAllGenders(), 
typeof(List<HumanGender>)) as List<HumanGender>
: isValueInCache.Value as List<HumanGender>;

Редактировать:

Я думаю, что метод RetrieveCacheValue вашего BaseCache возвращает неправильный тип.

person Luc Bos    schedule 26.07.2013
comment
Технически RetrieveCacheValue возвращает объект, а свойство value также возвращает объект. так что это одно и то же значение. - person joshua; 26.07.2013
comment
согласен с вами в этом. Документация Microsoft по этому вопросу неадекватна. - person joshua; 27.07.2013

Этот фрагмент кода извлечет объект из кэширования Windows Azure, если он есть, и сохранит его в кеше, если его нет:

DataCacheFactory cacheFactory = new DataCacheFactory();
cache = cacheFactory.GetCache("MyCache");
List<HumanGender> humanGenderList = cache.Get("allGenders") as List<HumanGender>;
if (humanGenderList == null)
{
    // "allGenders" not in cache. Obtain it from specified data source and add it.
    humanGenderList = Newtonsoft.Json.JsonConvert.DeserializeObject(proxy.GetAllGenders(), 
        typeof(List<HumanGender>)) as List<HumanGender>;
    cache.Put("allGenders", humanGenderList);
}

Дополнительные сведения см. в разделе Как использовать кэширование Windows Azure, Как использовать кэширование Windows Azure и Создание облачных служб Windows Azure с помощью службы кэширования.

person Fernando Correia    schedule 26.07.2013