C# 如何使用单例或静态实例进行全局网站设置
我有一个基本网页,用于继承我的所有aspx页面。我在基本页面中加入了几个通用方法,以便它在所有继承的aspx页面中都可用 我有一个属性可以获取此基本网页中的网站设置。它只是整个应用程序的一个记录。我将它存储在缓存中 BaseWebPage.cs属性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
//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页面的父级,所以我不能将其设置为“密封摘要”