0

我正在编写一个缓存提供程序来缓存任何类型的对象。当我从缓存中读取值时,问题是转换为正确的类型。

using (var redisClient = redisClientsManager.GetClient())
{
    redisClient.Set(key, value, new TimeSpan(1, 0, 0));
}

因此很容易将对象放入缓存中,然后将其转换为字符串。当我把它从缓存中拉出来时,它会变得有趣

 using (var redisClient = redisClientsManager.GetClient())
 {
     return redisClient.Get<object>(key);
 }

这不起作用,因为我们没有正确的类型来转换,所以默认是返回 json 字符串。

我在想我应该为我所有的食人鱼对象创建一个哈希然后有这样的东西

 piranha:cache id = "{ some json }"
 piranha:cache id:type = PAGETYPE

这将允许我在将对象保存到缓存时设置对象类型。我想知道是否有更好的方法来获取/设置正在缓存的对象类型?

理想情况下,代码会显式地进行转换,但是目前 redis 中的缓存只使用对象类型(我认为)。


public object this[string key]
{
    get
    {
        using (var redisClient = redisClientsManager.GetClient())
        {
            if (redisClient.HashContainsEntry(PiranhaHash, key))
            {
                string resultJson = redisClient.GetValueFromHash(PiranhaHash, key);
                string objType = redisClient.GetValueFromHash(PiranhaHash, String.Format("{0}:Type", key));

                Type t = JsonConvert.DeserializeObject<Type>(objType);
                object result = JsonConvert.DeserializeObject(resultJson, t);

                return result;
            }
        }
        return null;
    }
    set
    {
        using (var redisClient = redisClientsManager.GetClient())
        {
            redisClient.SetEntryInHash(PiranhaHash, key, JsonConvert.SerializeObject(value));
            redisClient.SetEntryInHash(PiranhaHash, String.Format("{0}:Type", key), JsonConvert.SerializeObject(value.GetType()));
        }
    }
}

在大多数情况下,此实现应该可以工作,但是 Page 对象不会正确地从 Json 反序列化,并且控制器将始终为空。我认为必须进行一些后端更改才能使这成为可能。

4

1 回答 1

1

由于目前不同的缓存提供者的数量非常有限,我们总是可以更改提供者接口以获得从长远来看会更好地工作的东西。我也有一些关于使 Get 操作通用以清理访问缓存的代码的想法。

从长远来看,也许这个界面会更好地工作:

/// <summary>
/// Gets the cached model for the given key.
/// </summary>
/// <typeparam name="T">The model type</typeparam>
/// <param name="key">The unique key</param>
/// <returns>The model</returns>
T Get<T>(string key);

/// <summary>
/// Sets the cached model for the given key.
/// </summary>
/// <param name="key">The unique key</param>
/// <param name="obj">The model</param>
void Set(string key, object obj);

/// <summary>
/// Removes the cached model for the given key.
/// </summary>
/// <param name="key">The unique key</param>
void Remove(string key);

由于这种更改将导致核心存储库中的大量更新,我必须在一个单独的分支中实现它以进行测试,您可以使用它来实现您的提供程序。


编辑

我仔细查看了 Page 对象,这些字段Controller, View, Redirect, IsPublished & IsStartpage是没有设置访问器的计算属性。此字段不应序列化为 JSON。正在使用哪个序列化程序以及可以使用哪些属性使序列化程序忽略属性(如 ScriptIgnore)。

此外,这些属性TemplateController, TemplateView, TemplateRedirect & TemplateName具有私有集访问器,我不知道这是否会成为正在使用的 JSON 序列化程序的问题。

问候

哈坎

于 2014-02-27T11:57:15.023 回答