C# 如何使用单例或静态实例进行全局网站设置

C# 如何使用单例或静态实例进行全局网站设置,c#,asp.net,singleton,global-variables,static-variables,C#,Asp.net,Singleton,Global Variables,Static Variables,我有一个基本网页,用于继承我的所有aspx页面。我在基本页面中加入了几个通用方法,以便它在所有继承的aspx页面中都可用 我有一个属性可以获取此基本网页中的网站设置。它只是整个应用程序的一个记录。我将它存储在缓存中 BaseWebPage.cs属性 //website settings public USP_GETWEBSITESETTINGSDETAILS WEBSITESETTING { get { USP_GETWEBSITESETTINGSDETAILS

我有一个基本网页,用于继承我的所有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\u USERID
CURRENT\u USERNAME
CURRENT\u USER\u 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;
    }
}
我读过关于单例和静态类的书,有相当的知识,但对于如何正确地使用它以获得非常好的体系结构,我并没有100%的把握

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

// Singleton instance of this class
public static readonly BasePage StaticInstance = new BasePage();
当我访问get/set的
BaseWebPage.StaticInstance.CURRENT_USERID
时,它是整个应用程序的一个副本,还是在会话中存储时是唯一的


谢谢你的建议。如果您有其他好的选择,请帮助改进我的体系结构。

我认为您的BasePage类根本不需要是单例的。只需将其设置为一个常规(可能是抽象)类,并使这些属性按您的方式存在,然后使用继承即可。

我以前多次使用单例模式,但从未在Web上使用过。为什么不直接使用会话,就像使用某些属性一样?会话对于整个应用程序来说几乎是一个实例。在任何情况下,您都可以看到Microsoft的最佳实践。再说一次,我不会推荐Singleton作为一个网站


祝你好运

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,它将是整个应用程序的唯一副本


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

我知道这一点,但您的建议没有帮助。我有一个BaseMasterPage.cs和几个其他子母版页。Base master不是从BaseWebPage.cs继承的,因此,如果我需要从BaseMasterPage.cs访问BaseWebPage的公共属性,我必须实例化它,但它将是我不希望的每个用户对象(对于每个新会话)。它不必是。这些属性可以是静态的,但类不一定是静态的。我已经找到了几种方法来创建一个单例类,我对一个好的建议很感兴趣,关于我是否需要使用它或静态方法或任何其他替代方法。我在BaseWebPage.cs中有几个公共方法,如前所述,它是我所有aspx页面的父级,所以我不能将其设置为“密封摘要”