C# 全局变量与ASP.NET会话状态
这听起来可能很幼稚,但我正在开发一个跨多个页面的web应用程序。所有这些页面都实例化了使用API访问CMS的同一类对象和方法。当前,当用户开始创建内容时,我将存储变量,如文件夹ID,其中内容位于会话变量中C# 全局变量与ASP.NET会话状态,c#,.net,asp.net,session,global,C#,.net,Asp.net,Session,Global,这听起来可能很幼稚,但我正在开发一个跨多个页面的web应用程序。所有这些页面都实例化了使用API访问CMS的同一类对象和方法。当前,当用户开始创建内容时,我将存储变量,如文件夹ID,其中内容位于会话变量中 我的问题是:我能否实例化一个类的单个实例,该实例可以在所有页面上使用,而不必在每个页面上都这样做?如果是这样的话,每个访问该页面的人都会得到他们自己版本的类吗?我认为使用静态变量和方法不是一种好办法,因为它们在内存中共享。此外,如果要在.net C#应用程序的Web应用程序中全局使用某个对象,
我的问题是:我能否实例化一个类的单个实例,该实例可以在所有页面上使用,而不必在每个页面上都这样做?如果是这样的话,每个访问该页面的人都会得到他们自己版本的类吗?我认为使用静态变量和方法不是一种好办法,因为它们在内存中共享。此外,如果要在.net C#应用程序的Web应用程序中全局使用某个对象,则在何处/如何声明该对象?如果要存储仅针对当前用户的信息,则应使用state 例如,在应用程序的一个页面中,您可以将一些值存储到会话中:
SomeType someValue = ...
Session["someKey"] = someValue;
SomeType someValue = (SomeType)Session["someKey"];
然后稍后在另一页从会话中检索它:
SomeType someValue = ...
Session["someKey"] = someValue;
SomeType someValue = (SomeType)Session["someKey"];
你要找的图案很简单。有两种方法可以实现它
每个都有其优点。我建议创建一个从System.Page继承的基类。然后让你的页面代码从中继承 然后,在基类内创建一个属性,该属性是对对象的引用。比如说:
public class BasePage : System.Web.UI.Page
{
public Foo CurrentFoo
{
get
{
return (Foo)Session["FooSessionObject"];
}
set
{
if(Session["FooSessionObject"] == null)
{
// instantiate a new one
Session["FooSessionObject"] = new Foo();
}
Session["FooSessionObject"] = value;
}
}
}
然后,在任何页面的任何地方,只需执行CurrentFoo。您将可以访问任何属性
这使得后面的代码简洁明了。这样做并在网站上使用全局over sessions的缺点很简单,即任何访问该网站的用户都可以访问全局变量,而不必考虑会话。以下面的代码为例
public class globals
{
static string _test = "MyTest";
public static string test
{
get
{
return _test;
}
set
{
_test = value;
}
}
创建全局类后,我向默认值添加了一个标签,并将全局变量文本指定给该标签
protected void Page_Load(object sender, EventArgs e)
{
globals.test = "Some Data";
}
现在,您将在页面的每一个表单上看到这一点,但这一点的缺点是,访问您的页面的任何其他人也将能够看到这些数据。如果它的数据需要在多个会话中共享,您可以这样做。如果当前用户只需要在多个类上共享其数据,则需要使用会话变量 我个人喜欢这个答案,它非常干净。我要用它。谢谢@Bill Martin-会话[“FooSessionObject”]的空检查是否应该不在get语句中?获取{if(Session[“FooSessionObject”]==null){//实例化一个新的会话[“FooSessionObject”]=new Foo();}返回(Foo)会话[“FooSessionObject”];有人问了一个类似的问题,我认为这几乎概括了您的所有选择。可能重复的“还有,如果某个东西要在.net C#应用程序的Web应用程序中全局使用,它在哪里/如何声明?”您可能想澄清一下这个问题。您当然可以在特定程序集中定义类,并在构建ASP.NET网站、Web服务、控制台应用程序等时引用该程序集。但是,如果您需要不同的应用程序来共享类的特定实例,那么您可能需要研究.NET远程处理或类似技术技术。