在 ASP.NET 中实现自定义对象实例的状态保持功能行为






3.33/5 (7投票s)
2005 年 11 月 1 日
2分钟阅读

27096

199
为 ASP.NET 中的对象提供状态保持功能。
前言
如果没有 Anastasia,我无法完成这篇文章。你很美好,很漂亮,你给我带来灵感和新的力量。我爱你。
引言
当您有一些需要作为类实现并在程序代码中通过相应类的对象呈现的业务逻辑时,在 aspx 页面回发期间保存该对象的状态通常变得至关重要。有时,由于 HTTP 的无状态特性,找到一个简单便捷的解决方案会变得困难。希望这篇文章能帮助您找到一些关于如何实现此功能的想法。以下解决方案基于单例模式。简而言之,单例模式允许您操作对象(调用其属性、方法),并保证在运行时只有一个该对象的实例。
使用代码
方案一
此方案强制您实现两个静态方法
// returns singeltone instance from current page Session
public static ShonnCapushonClass GetSingletoneInstance (Page page)
{
if (page.Session[ShonnCapushonClass.SessionId] != null)
{
return (ShonnCapushonClass)page.Session[ShonnCapushonClass.SessionId];
}
else
{
page.Session[ShonnCapushonClass.SessionId] = new ShonnCapushonClass ();
return (ShonnCapushonClass)page.Session[ShonnCapushonClass.SessionId];
}
}
和
public static void SetSingletoneInstance (Page page,
ShonnCapushonClass instance)
{
page.Session[ShonnCapushonClass.SessionId] = instance;
}
在 aspx 页面的代码隐藏文件中,它将如下所示
ShonnCapushonClass ShonnaObject =
ShonnCapushonClass.GetSingletoneInstance(this);
ShonnaObject.Name = "Tusenna";
当您不再需要此对象时,通过调用以下方法将其从会话中删除
ShonnCapushonClass.SetSingletoneInstance(this, null);
方案二
当对象的全部操作都封装在一个 aspx 页面中时,此方案会很有帮助。让我们定义一个页面属性,如下所示
private ShonnCapushonClass PageShonnaObject
{
get
{
return ShonnCapushonClass.GetSingletoneInstance(this);
}
set
{
ShonnCapushonClass.SetSingletoneInstance(this, value);
}
}
在这种情况下,可以通过引用页面属性轻松进行操作
PageShonnaObject.Name = "PageTysena";
LabelShonnaName.Text = PageShonnaObject.Name;
当您需要重置对象状态时,只需执行以下代码
PageShonnaObject = null;
方案三
这是最灵活的解决方案,可以在没有页面实例的情况下提供,并且在这种情况下,您的业务对象将从代码中访问,直到您显式销毁它或用户的会话过期。此外,您的对象将从您的 Web 应用程序中的任何页面访问:让我们像这样定义类的 Current
属性
public static ShonnCapushonClass Current
{
get
{
if ( HttpContext.Current.Session[ShonnCapushonClass.SessionId] == null )
{
ShonnCapushonClass shonnCapushon = new ShonnCapushonClass();
HttpContext.Current.Session[ShonnCapushonClass.SessionId] = shonnCapushon;
return shonnCapushon;
}
else
{
return (ShonnCapushonClass)
HttpContext.Current.Session[ShonnCapushonClass.SessionId];
}
}
set
{
HttpContext.Current.Session[ShonnCapushonClass.SessionId] = value;
}
}
之后,您的业务对象可以通过在任何应用程序页面中实现类似以下调用来访问
ShonnCapushonClass.Current.Name = "CurrentTysena";
或
ShonnCapushonClass.Current = null;
摘要
在本文中,我分享了一些关于在 aspx 页面回发之间管理业务对象状态的想法,并描述了一些使用会话状态和单例模式来绕过 HTTP 无状态约束的解决方案。