在类库中正确实现缓存以便在asp.net应用程序中使用

问题描述:

我正在实现一个类库中的缓存,我正在使用一个asp.net应用程序。在类库中正确实现缓存以便在asp.net应用程序中使用

我创建我的缓存对象作为一个单身模式与静态方法来更新缓存,这实际上只是加载一个成员变量/属性与我需要缓存的数据集合(获得一些锁定逻辑的逻辑)。我想这是一个很好的路要走,因为我可以通过调用

MyCacheObject.Instance.MyDataCollection 

我创建一个新的缓存对象来存储一些关键数据划分的一个相当大的访问量我的数据。我在说的是我创建了一个新的缓存,但是这个缓存不会一次加载所有的数据,而是为每个访问的密钥存储一个集合。

MyOtherCacheObject.Instance.MyOtherDataCollection(indexkey) 

这次提出了关于垃圾收集的问题。由于我存储了大量的数据,如果它突然变得很糟糕,不是很浪费吗?由于它只是一种单例模式,因此没有什么能确保数据保留在缓存中。

所以我的问题是 - 什么是实施缓存来处理这种情况的最佳做法?我真的不喜欢这个庞大复杂的解决方案,我知道System.Web中存在缓存,但这看起来有点“关闭”,因为这只是一个类库,或者你认为如何?

在我看来,最好的解决办法有以下特点:

  • 使用由该平台试图避免编写自己提供的可用缓存服务。

  • 不会将您的类库耦合到System.Web,以使图层保持一致。

  • 但是,如果类库在ASP.NET应用程序中运行,则解决方案不应要求在另一个缓存实现上(例如企业库缓存应用程序块),这需要额外的配置和设置。

因此,我将使用IoC策略,以便允许类库根据运行环境使用不同的缓存实现。

假设你定义抽象缓存合同:

public interface ICacheService 
{ 
    AddItem(...); 
} 

你可以提供基于System.Web程序的实现:

public AspNetBasedCacheService : ICacheService 
{ 
    AddItem(...) 
    { 
     // Implementation that uses the HttpContext.Cache object 
    } 
} 

再有,落实“发表了”为单身。请注意,与原始方法的区别在于,单例只是对基于ASP.NET缓存服务的实现的引用,而不是完整的“缓存对象”。

public class ChacheServiceProvider 
{ 
    public static IChacheService Instance {get; set;} 

} 

你将不得不或者通过,或在应用程序启动时执行初始化工作(在的global.asax.cs)

而且每个域组件将能够使用发布的缓存服务初始化chaching实施而不知道它是基于System.Web实现的。

// inside your class library: 
IChacheService chache = CacheServiceProvider.Instance; 
cache.AddItem(...); 

我同意这可能不是简单的解决办法,但我的目标,而不会牺牲代码解耦和灵活性,采取了ASP.NET缓存实现的优势。

我希望我能理解你的问题。

只要缓存仍然保存对其的引用,数据就不会被垃圾收集。

此外,千万不要使用单身人士。

+0

但我恐怕cacheobject会得到gc'ed而不是它缓存的数据。 – 2008-10-01 06:42:23

+1

也不是使用单例来保存我的缓存,那么更好的方法是什么? – 2008-10-01 06:43:25