2013-03-06 2 views
3

Я использую данный шаблон singleton для кэширования объекта класса в ASP.NET. Может ли кто-нибудь выделить недостатки этого подхода?Disadvanage данного Singleton cache patterm

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; }   
} 
+2

Я не знаю, если бы я назвал это синглтон, как таковой. Это просто статическая обертка поверх нестатических данных. Это в основном то, что делает HttpContext.Current', вы просто добавляете помощники, специфичные для вашего приложения. Я не вижу никаких проблем с этим. – Yuck

+0

небезопасный поток, но еще до этого - что вы пытаетесь сделать в методах 'getInstance' и' ReportRemovedCallback'? – YavgenyP

ответ

2

Я не вижу причин для того, чтобы сделать это синглом. Я бы просто написал оболочку для каждого свойства, которое получает/устанавливает значения. Таким образом, вы можете легко вводить его с помощью контейнера IoC и повышать тестируемость.

Как сейчас, ваш код не является потокобезопасным, что может вызвать проблемы.

+0

Как часто бывает несколько потоков, работающих с одним и тем же экземпляром 'HttpContext.Current'? – Yuck

+0

Меня не интересует текущий контекст - thats thread local. Это класс. '_instance' не охраняется. –

+0

@Yuck, почему, по вашему мнению, вряд ли будет более одного потока, обращающегося к объекту 'Cache'? он разделяет домен приложения, не так ли? – YavgenyP