ASP.NET中的请求或服务器特有的静态类实例?

时间:2008-12-12 18:35:29

标签: c# asp.net

 public sealed class UserLoginSingleton
{

     UserLoginCollection _userLoginCol = new UserLoginCollection();

    UserLoginSingleton()
    {
    }

    public static UserLoginSingleton Instance
    {
        get
        {
            IDictionary items = HttpContext.Current.Items;
            if (!items.Contains("TheInstance"))
            {
                items["TheInstance"] = new UserLoginSingleton();

            }
            return items["TheInstance"] as UserLoginSingleton;
        }
    }


    public void CreateUserObj(string xmlData)
    {
        _userLoginCol = (UserLoginCollection)_xmlUtil.Deserialize(xmlData, typeof(UserLoginCollection));
    }

    public UserLoginCollection getUserObj()
    {
        return _userLoginCol;
    }
}

用法:

Page 1.aspx

UserLoginSingleton.Instance.CreateUserObj(xml);

Pase2.aspx:

  

UserLoginCollection   userLoginCollection =   UserLoginSingleton.Instance.getUserObj();

点击这篇文章: link text

我在第1页设置了我的集合对象,然后执行response.redirect或点击链接以获取第2.aspx页。但是,我的单例实例没有设置的集合对象。如何在每个会话中跨多个页面保留我的集合对象?

我知道静态不会起作用,因为每个实例都会看到对象,我希望每个用户都能看到它。

5 个答案:

答案 0 :(得分:3)

HttpContext.Items集合是按请求的。因此,在您将用户重定向到page2.aspx的情况下,您在第1页上创建的实例已消失。要使相同的实例可以跨请求使用,您需要使用HttpContext.Session来存储您的实例。

答案 1 :(得分:0)

静态字段在请求之间共享。注意标准的多线程问题!

请求之间不共享HttpContext实例。

答案 2 :(得分:0)

使用读取HttpSession而不是静态变量的静态方法:


public class UserLoginController
{
    public static UserLoginController Instance
    {
        get
        {
            HttpSession session = HttpContext.Current.Session;
            if (session["UserLoginController"] == null)
            {
                session["UserLoginController"] = new UserLoginController();
            }
            return session["UserLoginController"] as UserLoginController;
        }
    }
}

答案 3 :(得分:0)

也许我需要重新思考我想做的事情。基本上我的集合是围绕下拉列表的不同值的集合。这是由客户提供的,我的网页需要显示它。

我认为客户端可以将它作为序列化数据发送给我,我给了他们xsd,他们会在登录时异步发送给我。第1页将收到序列化数据。登录页面将登录。一旦page1收到数据,将反序列化为我的强类型集合,反过来将用于在page2.aspx中构建下拉列表

为什么我以这种原始的方式做这件事。我的双手被限制捆绑,我试图不使用会话状态来保存这个对象,如果我可以避免它。

每个用户登录都有下拉列表的各种选项。 user 1 caan有10个选项,user 2可以有200个选项。

答案 4 :(得分:0)

只是指出你的单例实现是错误的,你的单例应该像这样声明

public sealed class Singleton
{
    static readonly Singleton instance=new Singleton();

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}
寻找你感兴趣的贴纸↓↓↓
豫ICP备18024241号-1