类似2个用户共有的Session变量可以随 用户/私聊/棋局

问题起源:

1,Session["变量名称"]对于编程,使用起来不方便,如果Session里面需要存储的变量名称过多,敲字符比较麻烦,如果根据Session["userID"]去数据库里存取,损失性能.

2,对于站内即时短消息,聊天,下棋性质的的程序,需要知道私聊对方的一些属性,由于通信频繁,而有些数据又没有长期保存的必要,所以需要一个类似2个用户共有的Session变量,这个变量可以随 用户/私聊/棋局 消失

而消失.

3,Ajax应用需要频繁的访问一些常用的对象变量,这些变量状态最好不要频繁从数据库读取,比如下棋的双方要知道对方是谁,颜色,走棋/聊天的变化等等,即是对方个人的东西,又是我方需要知道的内容,这些状态一经

创建,就要保留到用户离线为止.

4,相对精确判断离线的问题.

问题设想:
能不能创建一个类来实现一种Session一样的东东,对一个用户来说即可以单件模式创建,又可以指定的2个/几个用户在生存期共享?

可以用静态类的静态方法保证单件模式.返回一个实例来代替Session.这个办法类似设计模式里所说的享元模式或者某种工厂模式,叫他什么名字其实不重要,关键它很实用
.Net2.0以后提供了泛型,让实现这种模式更加方便,以下是精简的代码.

以下是代码:

using System.Collections.Generic;

public class User
{
    //一,实体类:
    public User(string userId)
    { }
    public User(string userId, string name, string color)
    {
        this.userId = userId;
        this.userName = name;
        this.color = color;
    }
    private string userId;
    private string color;
    private string userName;

    public string UserId
    {
        get { return userId; }
        set { userId = value; }
    }
    public string Color
    {
        get { return color; }
        set { color = value; }
    }
    public string UserName
    {
        get { return userName; }
        set { userName = value; }
    }
}
//二.管理实体类的类,叫它静态工厂也可以,用Dictionary来管理构造参数和返回的类,保证第一次创建后以后不重复创//建.
public static class UserManager
{
    public static Dictionary<string, User> DicUsers = new Dictionary<string, User>();
    public static User getUser(string UserId)
    {
        if (DicUsers.ContainsKey(UserId))
        {
            return (DicUsers[UserId]);
        }
        else
        {
            DicUsers.Add(UserId, new User(UserId));
        }
        return (DicUsers[UserId]);
    }
    public static User getUser(string UserId, string name, string color)
    {
        if (DicUsers.ContainsKey(UserId))
        {
            return (DicUsers[UserId]);
        }
        else
        {
            DicUsers.Add(UserId, new User(UserId, name, color));
        }
        return (DicUsers[UserId]);
    }

 //三,使用办法:
        Session.Add("userId", "001"); //创建一个Session
        string userId = Session["userId"].ToString();//获得Session的值

        User U= UserManager.getUser(userId, "张三", "兰色");//创建三个User对象
        UserManager.getUser("002", "张三002", "红色002");
        UserManager.getUser("003", "李四003", "紫色003");
      
        User U2 = UserManager.getUser(userId);     //用userId搜索User对象 ,在全局应用程序里都可以搜索 只要你创建了对象
        Response.Write(U2.UserId + U2.UserName + U2.Color); //打印搜索到的对象

        //例如:下棋和私聊,保证在全局应用程序里,两个人不重复创建了唯一的一个棋局/私聊
        //然后你想得到这个B的什么属性方法都可以,而且你可以得到或者设置当前棋局的每个用户的状态,这些状态可以在下棋/私聊结束的时候控制销毁掉。

 //在Global.asax文件的Session_End事件写以下代码即可控制销毁掉
void Session_End(object sender, EventArgs e)
    {
      string uid=Session["userId"].ToString();
    if(!(uid ==null || uid ==""))
      UserManager.RemoveUserID(uid);

    }
        //结合Ajax相对精确的判断对方离线。具体做法:自己想了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值