我正在使用新的.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/