C# 对给定单例缓存模式的禁用管理

C# 对给定单例缓存模式的禁用管理,c#,asp.net,caching,singleton,C#,Asp.net,Caching,Singleton,我使用给定的单例模式在ASP.NET中缓存类对象。有人能指出这种方法的缺点吗 public class CacheManager { private static CacheManager _instance; protected CacheManager(string key) { id = key; } public static CacheManager getInstance(string key) { if (HttpContext.Current.Cache[key] ==

我使用给定的单例模式在ASP.NET中缓存类对象。有人能指出这种方法的缺点吗

public class CacheManager
{
private static CacheManager _instance;

protected CacheManager(string key) { id = key; }
public static CacheManager getInstance(string key)
{
   if (HttpContext.Current.Cache[key] == null)
       HttpContext.Current.Cache.Insert(key, _instance = new CacheManger(key), null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(120),CacheItemPriority.Default,new CacheItemRemovedCallback(ReportRemovedCallback));

   return (CacheManager)HttpContext.Current.Cache[key];
}

private static void ReportRemovedCallback(string CacheManager, object value, CacheItemRemovedReason reason)
{            
    _instance = null;
}

public string id { get; private set; }        
public string field1 { get; set; }
public string field2 { get; set; }
public string field3 { get; set; }        
}

我看不出你有什么理由让这成为单身汉。我只需要为获取/设置值的每个属性编写一个包装器。通过这种方式,您可以更轻松地使用IoC容器注入它,并增加可测试性


目前来看,您的代码不是线程安全的,这也可能会导致问题。

我不知道我是否会将其称为单例。它只是对非静态数据的静态包装。这基本上就是
HttpContext.Current
所做的,您只需添加特定于应用程序的帮助程序。我看不出有任何问题。它不是线程安全的,但即使在这之前-您在
getInstance
ReportRemovedCallback
方法中尝试做什么?多个线程处理同一个
HttpContext.Current
实例的频率有多高?我不关心当前上下文-这是线程本地的。这是一节课<代码>\u实例未受保护。@哎呀,为什么您认为不太可能有多个线程访问
缓存
对象?它是由应用程序域共享的,不是吗?@YavgenyP
Cache
设计上是线程安全的。这完全取决于提供商。我不确定asp.net如何处理它。
Cache
可能是线程安全的(我认为是),但如果您使用
if..else
语句包装对它的访问,则不会,因此这取决于他在此处处理键的方式。无论如何,对我来说,他的代码没有任何意义(我不理解
\u instance
的作用,因为它似乎每次都被覆盖)。