asp.net HttpContext.Current.Cache синглтон-оболочка - PullRequest
0 голосов
/ 06 марта 2019

У меня есть класс, который я представляю как одиночный файл в старом приложении веб-форм 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()));
    }
}

Или есть лучший способ справиться с чем-то подобным в целом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...