asp.net – .NET 4.0 ObjectCache的线程安全和范围管理

我正在使用新的.NET 4.0 Caching API,ObjectCache.过去几天我已经在这方面问了几个问题,我暗示了这个问题 – 但是认为将其分解成自己的问题是值得的.

因为类是抽象的,所有的方法都是虚拟的,这意味着我们可以创建自己的自定义缓存提供者.

根据MSDN,ObjectCache不一定是单例,您可以在应用程序中创建多个实例.

但对我来说,这听起来就像我们需要管理这个对象的实例化和生命周期一样?

我有一个ASP.NET MVC 3 Web应用程序,StructureMap作为我的依赖注入容器.

我想为我的整个Web应用程序设置一个单独的共享缓存.

所以,我创建一个非常简单的类,它包装了ObjectCache类,并在方法实现中提供了拆箱.

该类在ctor中使用ObjectCache的一个实例,并将其设置为高速缓存的私有静态实例,方法(Add,Get等)可用.

例如

public class CacheManager
{
   private static ObjectCache _cache;

   public CacheManager(ObjectCache cache)
   {
      _cache = cache;
   }

   // Add,Get,Remove methods work off _cache instance.
}

现在,这是我的DI注册表:

For<CacheManager>().Singleton().Use<CacheManager>().Ctor<ObjectCache>("cache").Is(MemoryCache.Default);

在英语中:当某事物请求CacheManager实例时,使用单例实例,并将ObjectCache参数设置为MemoryCache实例.

所以我有什么,现在的问题:

>如果我有一个类来包装ObjectCache,这个类是否需要一个单例?
> MSDN说ObjectCache是​​线程安全的,但现在我使用单例,我需要任何类型的锁定来保持线程安全吗?
>我的包装类中的ObjectCache的私有实例需要是静态的吗?类本身是否需要静态?
>对总体实施的一般想法?

我无法在ASP.NET Web应用程序中找到一个有关.NET ObjectCache的体面博客/文章,因此我的困惑.

我使用HttpContext.Current.Cache(这是静态的),而不关心缓存的生命周期管理.

解决方法

>由于MemoryCache.Default是一个单例,因此无状态类不一定是一个.但是,这完全取决于你.
>您不应该需要锁定ObjectCache实例.
>否,否.使静态不提供任何价值.指示它在StructureMap中是单例,使得GetInstance&()总是返回相同的对象.
>包装ObjectCache的真正价值将是缓存实现的抽象,所以你可以改变它或模拟它.没有接口,这不太有用.

下面的示例实现…

public interface ICacheManager
{
   // add,get,remove,etc
}

public class CacheManager : ICacheManager
{
   private static ObjectCache _cache;

   public CacheManager(ObjectCache cache)
   {
      _cache = cache;
   }

   // Add,Remove methods work off _cache instance.
}

然后…

For<ICacheManager>()
    .Singleton()
    .Use<CacheManager>();

For<ObjectCache>()
    .Use(MemoryCache.Default);

如果您想要更改您以后仍然是ObjectCache的缓存提供程序,那么很容易调整.

我希望这有帮助!

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...