大家在开发网页的时候或多或少会碰到要传session的问题,可是session多了,就不好控制了;而且特别是多用户操作同一个页面是,同是session["Name"],可能用户A和用户B需要的值也不同,这就碰到另一个问题:当页面刷新时,新的session["Name"]的值会覆盖掉原来的,这也许是用户不需要看到的,所以先就这两个问题给出我的一个解决办法。
一个SessionInfo.cs类,里面放你网站中所有需要通过session传的值,把这些需要传的值的名称作为这个类的一个属性,例如:
public class SessionInfo
{
private string FUserId;
/// <summary>
/// 用户ID。
/// </summary>
public string UserId
{
get { return FUserId; }
set { FUserId = value; }
}
private string FPersons;
/// <summary>
/// 人数。
/// </summary>
public string Persons
{
get { return FPersons; }
set { FPersons = value; }
}
……
}
然后给个工厂类创建它。
/// <summary>
/// Session数据静态类工厂。
/// </summary>
public static class SessionInfoFactory
{
/// <summary>
/// 创建Session信息类。
/// </summary>
/// <returns></returns>
public static SessionInfo Create()
{
return new SessionInfo();
}
}
一个SessionPool.cs类:
/// <summary>
/// SessionPool 的摘要说明
/// </summary>
public class SessionPool
{
private Dictionary<string, SessionInfo> FValues;
/// <summary>
/// 字典。
/// </summary>
public Dictionary<string, SessionInfo> Values
{
get { return FValues; }
set { FValues = value; }
}
/// <summary>
/// 构造。
/// </summary>
public SessionPool()
{
FValues = new Dictionary<string, SessionInfo>();
}
}
到这里,大家可能就会看出这个代码的结构和思想了。下面,又是一个工厂类:
/// <summary>
/// Session池的静态工厂类。
/// </summary>
public static class SessionPoolFactory
{
/// <summary>
/// 创建SessionPool类。
/// </summary>
/// <returns></returns>
public static SessionPool Create()
{
return new SessionPool();
}
}
这样类就写完了。
然后,在会话开始的时候,创建这个session池,Dictionary<string, SessionInfo>里面的string可以用一个唯一标志符GUID之类的,然后把这个Id通过参数传到需要session的任何一个页面即可。但是这里要注意了,之所以用一个字典存sessionInfo,就是因为每个页面都可能创建一个sessionInfo(因为传的属性可能不同),所以每创建一个sessionInfo就会new一个新的Guid。
这样有个不好的地方是sessionPool会越来越大,相信有人会有更好的办法,希望可以一起讨论讨论。
今天先写到这,有时间再慢慢谈页面的职能与创建sessionInfo的条件问题。
一个SessionInfo.cs类,里面放你网站中所有需要通过session传的值,把这些需要传的值的名称作为这个类的一个属性,例如:
public class SessionInfo
{
private string FUserId;
/// <summary>
/// 用户ID。
/// </summary>
public string UserId
{
get { return FUserId; }
set { FUserId = value; }
}
private string FPersons;
/// <summary>
/// 人数。
/// </summary>
public string Persons
{
get { return FPersons; }
set { FPersons = value; }
}
……
}
然后给个工厂类创建它。
/// <summary>
/// Session数据静态类工厂。
/// </summary>
public static class SessionInfoFactory
{
/// <summary>
/// 创建Session信息类。
/// </summary>
/// <returns></returns>
public static SessionInfo Create()
{
return new SessionInfo();
}
}
一个SessionPool.cs类:
/// <summary>
/// SessionPool 的摘要说明
/// </summary>
public class SessionPool
{
private Dictionary<string, SessionInfo> FValues;
/// <summary>
/// 字典。
/// </summary>
public Dictionary<string, SessionInfo> Values
{
get { return FValues; }
set { FValues = value; }
}
/// <summary>
/// 构造。
/// </summary>
public SessionPool()
{
FValues = new Dictionary<string, SessionInfo>();
}
}
到这里,大家可能就会看出这个代码的结构和思想了。下面,又是一个工厂类:
/// <summary>
/// Session池的静态工厂类。
/// </summary>
public static class SessionPoolFactory
{
/// <summary>
/// 创建SessionPool类。
/// </summary>
/// <returns></returns>
public static SessionPool Create()
{
return new SessionPool();
}
}
这样类就写完了。
然后,在会话开始的时候,创建这个session池,Dictionary<string, SessionInfo>里面的string可以用一个唯一标志符GUID之类的,然后把这个Id通过参数传到需要session的任何一个页面即可。但是这里要注意了,之所以用一个字典存sessionInfo,就是因为每个页面都可能创建一个sessionInfo(因为传的属性可能不同),所以每创建一个sessionInfo就会new一个新的Guid。
这样有个不好的地方是sessionPool会越来越大,相信有人会有更好的办法,希望可以一起讨论讨论。
今天先写到这,有时间再慢慢谈页面的职能与创建sessionInfo的条件问题。
本文介绍了一种在多用户环境中管理Session的有效方法,通过创建SessionInfo类及其工厂类,使用Dictionary来存储不同的Session信息,解决了Session值覆盖及多用户同步问题。
1402

被折叠的 条评论
为什么被折叠?



