У меня есть класс, который я представляю как одиночный файл в старом приложении веб-форм asp.net. Класс используется как одноэлементный, потому что он выполняет некоторые исчерпывающие операции чтения файловой системы, которые я хочу выполнять только при запуске приложения. Это упрощенный пример.
public sealed class WidgetService
{
private static object _lock = new object();
private WidgetService()
{
}
public static WidgetService Instance
{
get
{
var cachedInstance = HttpContext.Current.Cache["WidgetService"] as WidgetService;
if (cachedInstance == null)
{
lock (_lock)
{
cachedInstance = HttpContext.Current.Cache["WidgetService"] as WidgetService;
if (cachedInstance == null)
{
cachedInstance = new WidgetService();
HttpContext.Current.Cache["WidgetService"] = cachedInstance;
}
}
}
return cachedInstance;
}
}
private List<Widget> _widgets;
public List<Widget> Widgets
{
get
{
if (_widgets == null)
{
lock (_lock)
{
if (_widgets == null)
{
_widgets = GetWidgetsFromFileSystem();
}
}
}
return _widgets;
}
}
}
Доступ к виджетам на веб-странице осуществляется по телефону:
WidgetService.Instance.Widgets
Насколько я понимаю, кеш в asp.net является потокобезопасным. Так я переборщил с замками в свойстве Instance? Могу ли я переписать свойство как:
public static WidgetService Instance
{
get
{
return (WidgetService)(HttpContext.Current.Cache["WidgetService"] ?? (HttpContext.Current.Cache["WidgetService"] = new WidgetService()));
}
}
Или есть лучший способ справиться с чем-то подобным в целом?