当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在类库中正确实现缓存以在asp.net应用程序中使用》经验,为你挑选了1个好方法。

我正在我在asp.net应用程序中使用的类库中实现缓存.

我使用静态方法创建了我的缓存对象作为单例模式来更新缓存,这实际上只是加载一个成员变量/属性,其中包含我需要缓存的数据集合(得到一些锁定逻辑的课程).我认为这是一个很好的方式,因为我可以通过调用访问我的数据

MyCacheObject.Instance.MyDataCollection

我正在创建一个新的缓存对象来存储由某个键分区的大量数据.我所说的是我正在创建一个新的缓存,但是这个不会一次加载所有数据,而是为每个访问的密钥存储一个集合.

MyOtherCacheObject.Instance.MyOtherDataCollection(indexkey)

这次提出了关于垃圾收集的问题.由于我存储了大量的数据,如果突然得到gc,它不会是浪费吗?由于它只是一个单例模式,因此无法确保数据保留在缓存中.

所以我的问题是 - 实现缓存来处理这种情况的最佳做法是什么?我真的不喜欢这个非常复杂的解决方案,我知道System.Web中有缓存,但这似乎有点"关闭",因为这只是一个类库,或者你怎么看?



1> Sergio Acost..:

在我看来,最好的解决方案将具有以下特征:

使用平台提供的可用缓存服务来避免编写自己的缓存服务.

不将您的类库耦合到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缓存实现而不牺牲代码解耦和灵活性.

我希望我理解你的问题.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有