Строго въведени глобални данни в 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 свойство ефективно имплементира квази-singleton, който е един на заявка. Ако бях на ваше място, единствената промяна, която бих направил, е да използвам HttpContext.Current.Items, който е кеш, който живее за жизнения цикъл на заявката, ако е достъпен за вас. - person Haney; 06.06.2013
comment
Благодаря ви за съвета относно оператора as, много полезен за поддържане на кода чист, когато може да има нула. - person Knox; 08.06.2013