HttpContext.Current.Cache的替代品

时间:2009-12-09 20:08:54

标签: c# caching

HttpContext.Current.Cache有什么替代方案?

我只处理应用程序层而不是Web层,那么最适合的是什么?

我们显然不想使用它,因为应用层中的单元测试不会有HttpContext。

简单的列表或字典对象会起作用吗?

3 个答案:

答案 0 :(得分:3)

一个简单的列表或字典对象可以工作,只要你不介意缓存项永不过期(除非你编写代码将它们删除列表/字典) - 可能不是一个好的解决方案,除非你只是缓存一个少量数据。查看非ASP.NET应用程序的一个解决方案是Enterprise Library Caching Application Block

答案 1 :(得分:2)

我倾向于努力工作,不写任何类型的缓存代码。我利用其他库(如StructureMap)的缓存功能来处理我的依赖注入和缓存需求。它提供了一个名为Hybrid的缓存作用域,它将使用ThreadLocal或HttpContext,具体取决于它的调用位置。它使测试更加有效。

答案 2 :(得分:2)

您可能需要考虑创建基于服务模式的缓存接口,例如 ICacheService 。然后,您可以使用依赖注入或其他工厂模式来连接您需要的缓存实现的实现。

例如,我有一个应用程序,它根据我使用应用程序的方式使用各种Cache实现。

1)。在测试模式下,我使用“ DummyCacheService ”实际上根本没有缓存,因为对于我的测试,我不希望数据缓存。

2)。共享主机我使用 AspCacheService 来实现标准的HttpContext.Current.Cache

3)。然后我将其移至专用服务器场并使用 MemCacheService 实现。

4)。最近我正在Windows Azure上测试,所以我们最近创建了一个 AzureCacheService ......

这个策略的美妙之处在于我们不必在应用程序代码中更改单行代码......我们简单地编写了一个源自 ICacheService 并在应用程序之外进行全面测试,一旦准备就绪,我们使用Windsor / Castle DI容器注入我们的生产现场。

供参考,这是我们使用的界面....这可以修改以满足您的需要,但它对我们很有用

public interface ICacheService
    {
        // TO-DO consider a cache group concept where you have groups of cache items, similar to cache manager in EntLib

        void Flush();
        void Add(string key, object item, int expirationInSeconds);
        void Add(string key, object item, int expirationInSeconds, CacheItemPriority priority);
        void Add(string key, object item, DateTime absoluteExpiration);
        void Add(string key, object item, DateTime absoluteExpiration, CacheItemPriority priority);
        void Add(string key, object item, TimeSpan slidingExpiration);
        void Add(string key, object item, TimeSpan slidingExpiration, CacheItemPriority priority);
        object Get(string key);
        object Remove(string key);
        T Get<T>(string key);
        IList<string> GetCacheKeys();
        bool ContainsData(string key);

    }