gpt4 book ai didi

c# - 在 asp.net 应用程序中使用的类库中正确实现缓存

转载 作者:太空狗 更新时间:2023-10-29 18:28:32 24 4
gpt4 key购买 nike

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

我将缓存对象创建为单例模式,使用静态方法来更新缓存,这实际上只是用我需要缓存的数据集合加载成员变量/属性(当然有一些锁定逻辑)。我认为这是一个不错的方式,因为我可以通过调用

访问我的数据
MyCacheObject.Instance.MyDataCollection

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

MyOtherCacheObject.Instance.MyOtherDataCollection(indexkey)

这次提出了关于垃圾回收的问题。由于我正在存储大量数据,如果突然对它进行 gc 处理,那不是浪费了吗?由于它只是一个单例模式,因此无法确保数据保留在缓存中。

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

最佳答案

在我看来,最好的解决方案应该具有以下特点:

  • 使用平台提供的可用缓存服务,尽量避免自己编写。

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

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

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

假设您将抽象缓存合约定义为:

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

您可以提供基于 System.Web 的实现:

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

然后将该实现作为单例“发布”。请注意,与您的原始方法的不同之处在于,单例只是对基于 ASP.NET 缓存服务的实现的引用,而不是完整的“缓存对象”。

public class CacheServiceProvider 
{
public static ICacheService Instance {get; set;}

}

您必须通过执行惰性初始化或在应用程序启动时(在 Global.asax.cs 中)来初始化缓存实现

并且每个域组件都可以使用已发布的缓存服务,而无需知道它是基于 System.Web 实现的。

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

我同意这可能不是最简单的解决方案,但我的目标是在不牺牲代码解耦和灵 active 的情况下利用 ASP.NET 缓存实现。

希望我没听错你的问题。

关于c# - 在 asp.net 应用程序中使用的类库中正确实现缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/156478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com