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

RPM*_*984 14 asp.net caching dependency-injection .net-4.0 thread-safety

我正在使用新的.NET 4.0缓存API,ObjectCache.最近几天我在这方面问了几个问题,我已经暗示了这个问题 - 但是认为把它分解成自己的问题是值得的.

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

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

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

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

我想为我的整个Web应用程序提供一个共享缓存.

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

该类接受ObjectCachector中的一个实例,并将其设置为缓存的私有静态实例,方法(Add,Get等)可以解决这个问题.

例如

public class CacheManager
{
   private static ObjectCache _cache;

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

   // Add, Get, Remove methods work off _cache instance.
}
Run Code Online (Sandbox Code Playgroud)

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

For<CacheManager>().Singleton().Use<CacheManager>().Ctor<ObjectCache>("cache").Is(MemoryCache.Default);
Run Code Online (Sandbox Code Playgroud)

英文版:当某些内容请求CacheManager实例时,请使用单例实例,并将ObjectCache参数设置为MemoryCache实例.

所以我有,现在问题:

  1. 如果我有一个类来包装ObjectCache,这个类需要是一个单例吗?
  2. MSDN说ObjectCache是线程安全的,但现在我使用的是单例,我是否需要任何类型的锁定才能保证线程安全?
  3. ObjectCache我的包装类中的私有实例是否需要是静态的?类本身是否需要是静态的?
  4. 关于我整体实施的一般想法?

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

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

Tra*_*vis 6

  1. 既然MemoryCache.Default是单身人士,那么你的无国籍阶级并不一定是一个.但是,这完全取决于你.
  2. 您不应该需要锁定ObjectCache实例.
  3. 不,并且不.使它静止不提供任何价值.表明它是StructureMap中的单例,GetInstance<>()总是会返回相同的对象.
  4. 包装的真正价值在于ObjectCache缓存实现是抽象的,因此您可以更改它或模拟它.没有接口,这变得不那么有用.

下面的示例实现......

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

public class CacheManager : ICacheManager
{
   private static ObjectCache _cache;

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

   // Add, Get, Remove methods work off _cache instance.
}
Run Code Online (Sandbox Code Playgroud)

然后...

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

For<ObjectCache>()
    .Use(MemoryCache.Default);
Run Code Online (Sandbox Code Playgroud)

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

我希望这有帮助!