我正在使用新的.NET 4.0缓存API ObjectCache。最近几天,我在这方面提出了一些问题,并暗示了这个问题-但认为值得将其分解为自己的问题。

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

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

但是对我来说,这听起来像我们还需要管理该对象的实例化和生存期?

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

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

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

该类在ctor中获取ObjectCache的实例,并将其设置为高速缓存的私有静态实例,该方法(添加,获取等)可以使用。

例如

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, Get, Remove methods work off _cache instance.
}


然后...

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

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


如果要更改以后仍为ObjectCache的缓存提供程序,则调整起来很容易。

我希望这有帮助!

关于asp.net - .NET 4.0 ObjectCache的线程安全和范围管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4951482/

10-09 03:31