Невозможно преобразовать Redis.RedisValue в Task <T> - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь написать общий класс / интерфейс, который будет извлекать данные из Redis Cache. Я попытался сделать его универсальным, потому что у нас разные типы данных, и сложно написать так много классов для каждого типа данных.

Вот мой интерфейс и класс.

public interface IRedisCache<T>
{
    Task<T> GetValue(string code);
}

public class RedisCache<T> : IRedisCache<T>
{

    public RedisCache()
    {

    }

    public Task<T> GetValue(string code)
    {
        var cache = RedisConnectorHelper.Connection.GetDatabase();
        var value = cache.StringGet($"Device_Status:{code}");

        Task<T> myTask = (Task<T>)value;

        return myTask;
    }

}

У меня проблема в строке:

Task<T> myTask = (Task<T>)value;

Проблема заключается в преобразовании типа Redis.RedisValue в тип Task<T>.

Я получаю сообщение об ошибке

"Невозможно преобразовать тип Redis.Redisvalue в System.Threading.Tasks.Task<T>"

Я использую библиотеку Stack Exchange.Redis с ядром Dot Net 2.

1 Ответ

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

Предполагая, что значение изначально было сохранено как JSON в кэше,

cache.StringSet($"Device_Status:{code}", JsonConvert.SerializeObject(myObject)));

затем просто десериализовать возвращаемое значение до нужного типа

public async Task<T> GetValue(string code) {
    var cache = RedisConnectorHelper.Connection.GetDatabase();
    var value = await cache.StringGetAsync($"Device_Status:{code}");
    T resultFromCache = JsonConvert.DeserializeObject<T>(value);
    return resultFromCache;
}

Я бы предложил рефакторинг службы кэширования до

public interface IRedisCache {
    Task<T> GetValue<T>(string code);
}

С реализацией, используя то, что было предложено выше

public class RedisCache : IRedisCache {
    public async Task<T> GetValue<T>(string code) {
        var cache = RedisConnectorHelper.Connection.GetDatabase();
        var value = await cache.StringGetAsync($"Device_Status:{code}");
        T resultFromCache = JsonConvert.DeserializeObject<T>(value);
        return resultFromCache;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...