Строго типизированные глобальные данные на веб-страницах ASP.Net

Как лучше хранить строго типизированные глобальные данные на веб-страницах ASP.Net, которые уникальны для каждого запроса? В основном мне нужно WebPageContext.Current.PageData, но строго типизированное.

До сих пор я придумал что-то вроде этого:

public sealed class GlobalData
{
    public static GlobalData Current
    {
        get
        {
            if (WebPageContext.Current.PageData["GlobalData"] == null
                || WebPageContext.Current.PageData["GlobalData"].GetType() != typeof(GlobalData))
            {
                WebPageContext.Current.PageData["GlobalData"] = new GlobalData();
            }
            return WebPageContext.Current.PageData["GlobalData"];
        }
    }

    public string SomeData { get; set; }
}

Таким образом, я мог просто получить доступ к своим данным с помощью GlobalData.Current.SomeData на каждой странице. Или есть лучшее решение?


person android    schedule 06.06.2013    source источник


Ответы (1)


Это довольно хороший подход. Я бы немного упростил:

public sealed class GlobalData
{
    public static GlobalData Current
    {
        get
        {
            // soft cast using "as" which will return null if the type is not correct
            var globalData = WebPageContext.Current.PageData["GlobalData"] as GlobalData;
            if (globalData == null)
            {
                // Need to instantiate
                globalData = new GlobalData();
                WebPageContext.Current.PageData["GlobalData"] = globalData;
            }

            return globalData;
        }
    }

    public string SomeData { get; set; }
}
person Haney    schedule 06.06.2013
comment
Спасибо за ваш вклад! Поскольку я хотел бы, чтобы все было просто и кратко, как вы думаете, есть ли способ избавиться от этого статического свойства Current? Я бы предпочел просто получить доступ к своим данным с помощью GlobalData.SomeData. Это, вероятно, будет работать со статическим конструктором, но тогда он не будет создавать новые GlobalData для каждого запроса, верно? - person android; 06.06.2013
comment
Вы не можете сделать GlobalData статическим, потому что тогда все пользователи будут совместно использовать одну копию. Поскольку вам нужна копия для каждого пользователя, статическое свойство Current эффективно реализует квази-синглтон, по одному на каждый запрос. Если бы я был на вашем месте, единственное изменение, которое я бы сделал, — это использовать HttpContext.Current.Items, который представляет собой кеш, который существует для жизненного цикла запроса, если он вам доступен. - person Haney; 06.06.2013
comment
Спасибо за подсказку об операторе as, очень полезном для поддержания чистоты кода, когда может быть ноль. - person Knox; 08.06.2013