Как я могу использовать синглтон или статический экземпляр для моих глобальных настроек веб-сайта - PullRequest
2 голосов
/ 28 декабря 2011

У меня есть базовая веб-страница, которая используется для наследования всех моих страниц aspx. У меня есть несколько общих методов, которые я поместил в базовую страницу, чтобы они были доступны на всех унаследованных страницах aspx.

У меня есть одно свойство, чтобы получить настройки моего веб-сайта на этой базовой веб-странице. Это всего лишь одна запись для всего приложения. Я храню его в кэше.

BaseWebPage.cs свойство

//website settings
public USP_GETWEBSITESETTINGSDETAILS WEBSITESETTING
{
    get
    {
        USP_GETWEBSITESETTINGSDETAILS aWebsiteDetails = null;
        if (Cache["websettings"] != null)
        {
            aWebsiteDetails = (USP_GETWEBSITESETTINGSDETAILS )Cache["WEBSITESETTINGSDETAILS"];
        }
        else
        {
            aWebsiteDetails = GetWebsitesettingsDetails();
            Cache["websettings"] = aWebsiteDetails;
        }
        return aWebsiteDetails;
    }
    set
    {
        Cache["websettings"] = (USP_GETWEBSITESETTINGSDETAILS )value;
    }
}

что я хочу сделать, это что-то вроде

BaseWebPage.StaticInstance.WEBSITESETTING, так что я могу получить доступ к общим настройкам на любой другой странице.

Помните, у меня есть другие свойства в этом файле BaseWebPage.cs, такие как

CURRENT_USERID, CURRENT_USERNAME, CURRENT_USER_FULLNAME и т. Д. Они аналогичны вышеуказанному свойству за исключением того, что значения хранятся в сеансе. Например:

public int CURRENT_USERID
{
    get
    {
        int iID = 0;
        if (Session["MYUSERID"] == null)
            iID = 0;
        else
            Int32.TryParse(Session["MYUSERID"].ToString(), out iID);
        return iID;
    }
    set
    {
        Session["MYUSERID"] = (int)value;
    }
}

Я читал об Singleton и статическом классе и у меня есть приличные знания, но я не уверен на 100%, как правильно его использовать, чтобы иметь очень хорошую архитектуру.

Если добавить строку ниже в BaseWebPage.cs

// Singleton instance of this class
public static readonly BasePage StaticInstance = new BasePage();

А когда я получу доступ к BaseWebPage.StaticInstance.CURRENT_USERID для получения / установки, это будет одна копия для всего приложения или она будет уникальной, поскольку я храню ее в сеансе?

Большое спасибо за все предложения. Пожалуйста, помогите улучшить мою архитектуру, если у вас есть другие хорошие альтернативы.

Ответы [ 3 ]

3 голосов
/ 28 декабря 2011

Я не думаю, что ваш класс BasePage вообще должен быть одиночным. Просто сделайте его обычным (возможно, абстрактным) классом, и эти свойства будут существовать так, как они есть, и просто используйте наследование.

1 голос
/ 28 декабря 2011

Хорошо, область действия статического класса в asp.net является глобальной и похожа на объект приложения.Поэтому независимо от вашего сеанса вы всегда будете получать доступ к одному и тому же экземпляру во всем сеансе вашего сайта asp.net.

Для создания одноэлементного экземпляра не используйте просто статическое чтение только;вместо этого вы можете иметь что-то вроде ниже;который является поточно-ориентированнымодна копия для всего приложения.

Я использовал этот тип кода, и он работал очень хорошо для меня.

1 голос
/ 28 декабря 2011

Я использовал шаблон Singleton много раз прежде, но никогда для Интернета. Почему бы вам просто не использовать Session так, как вы делаете это с некоторыми вашими свойствами? Сессия в значительной степени один экземпляр, для всего приложения. В любом случае, Здесь вы можете увидеть лучшие практики от Microsoft. Опять же, я бы не рекомендовал Singleton для веб-сайта вообще.

Удачи!

...