0

我正在考虑向我们的 .net Web 应用程序引入分布式缓存。

我一直在玩 memcache,特别是 Enyim Memcached Client。

一切都很顺利。我能够从缓存中添加和检索项目。

例如:

MemcachedClient cache = new MemcachedClient();
cache.Store(Enyim.Caching.Memcached.StoreMode.Set, key, value, absoluteExpiration);

现在我的问题是这个。我们的应用程序很大,多年来由许多开发人员构建。我们的应用经常使用 HttpRuntime.Cache

例如 HttpRuntime.Cache.Add(...

理想情况下,我不想通过搜索和替换来浏览所有代码以将每个“HttpRuntime.Cache.Add”更新为“cache.Store”。将 'Cache["blah"]' 替换为 'cache.Get("blah")' 也很困难。

我错过了一个技巧吗?有没有办法调用“HttpRuntime.Cache.Add”可以使用内存缓存“cache.Get”?在我看来,这将不需要搜索和替换。

谢谢阅读

4

1 回答 1

0

如果您要创建对第三方组件的依赖项,我建议您使用类似这样的包装器或外观来执行此操作。然后,您可以替换所有现有的 Cache 用法,以及何时以及如果您想要更改底层缓存提供程序,您只需在一次地方更改您的代码。

public interface IHappyCache
{
    object Add(string key, object value, CacheDependency dependencies, 
        DateTime absoluteExpiration, TimeSpan slidingExpiration, 
        CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

    object this[string key] { get; set; }
}

public class HappyCache : IHappyCache
{
    public object Add(string key, object value, CacheDependency dependencies, 
        DateTime absoluteExpiration, TimeSpan slidingExpiration, 
        CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback)
    {
        //wrapper to whatever caching mechanism you want to use
        return new object();
    }

    public object this[string key]
    {
        get
        {
            //wrapper to whatever caching mechanism you want to use
            return new object();
        }
        set
        {
            //wrapper to whatever caching mechanism you want to use
        }
    }
}

当然,您可能会发现您必须构建该接口和实现比我在这里更多。我建议您使用 IOC 容器在需要的地方注入接口,以便您的测试可以使用替代实现或模拟。

于 2013-09-16T03:52:03.380 回答