如何在全局网站设置中使用单例或静态实例

时间:2011-12-28 14:19:27

标签: c# asp.net singleton global-variables static-variables

我有一个基本网页,用于继承我的所有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_USERIDCURRENT_USERNAMECURRENT_USER_FULLNAME等。除了值存储在Session中之外,它们与上面的属性类似。例如:

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和静态类的知识,并且拥有相当不错的知识,但并不是百分之百确定如何以正确的方式使用它来拥有非常好的架构。

如果我在BaseWebPage.cs中添加以下行

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

当我访问BaseWebPage.StaticInstance.CURRENT_USERID获取/设置时,它是整个应用程序的单个副本还是因为我将其存储在Session中而是唯一的?

非常感谢所有建议。如果你有其他好的选择,请帮助改善我的架构。

3 个答案:

答案 0 :(得分:3)

我认为您的BasePage类根本不需要是单例。只需使它成为一个常规(也许是抽象)类,并让它们存在,只要使用继承即可。

答案 1 :(得分:1)

我以前曾多次使用过Singleton模式,但从未使用过Web。为什么不像你使用某些属性那样使用Session? Session几乎是整个应用程序的一个实例。无论如何,Here你可以看到微软的最佳实践。同样,我根本不会推荐Singleton用于网站。

祝你好运!

答案 2 :(得分:1)

asp.net中静态类的范围是全局的,类似于应用程序对象。 因此,无论您的会话如何,您都将在asp.net网站的所有会话中访问相同的实例。

为了创建单例实例,不要只使用静态只读;相反,你可以有类似下面的东西;这是线程安全的。

//sample code
public sealed class BaseWebPage : Page
{
static BaseWebPage instance=null;
static readonly object padlock = new object();

BaseWebPage()
{
}

public static BaseWebPage Instance
{
    get
    {
        if (instance==null)
        {
            lock (padlock)
            {
                if (instance==null)
                {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

// ..其他代码 }

然后在任何页面中都可以访问

BaseWebPage.Instance.WEBSITESETTING,它只是整个应用程序的单一副本。

我使用过这种类型的代码,对我来说效果非常好。