实例化类时,按用户存储该实例

时间:2010-02-15 12:40:17

标签: asp.net ironpython

我必须执行以下操作,当实例化类时,我需要按用户存储该实例。由于我在asp.net工作,我想知道是否应该使用asp.net提供的一些方法来在用户请求之间保留数据。 (缓存不能因为数据需要持久且应用程序状态不能因为它需要特定于用户),或者我应该寻找一种方法将该信息存储在类中。它需要持续存在,直到我以编程方式说出来

2 个答案:

答案 0 :(得分:7)

会话是存储特定用户数据的理想场所。

让我们假设这个答案,需要在用户会话中持久化的类称为UserInfo。首先要确保它被标记为Serializable,以便它可以存储在Session:

/// <summary>
/// My custom class stored per user in Session. Marked as Serializable.
/// </summary>
[Serializable()]
public class UserInfo
{
    public string SimpleProperty
    { get; set;}
}

从ASP.NET应用程序的App_Code文件夹中的代码隐藏或类,您可以直接调用会话:

//creating the user info as needed:
UserInfo currentUserInfo = new UserInfo();

//storing the user info instance:    
Session["UserInfo"] = currentUserInfo;

//getting the user info as needed:
UserInfo currentUserInfo = (UserInfo)Session["UserInfo"];

如果在ASP.NET网站/应用程序引用的应用程序一部分的类库/外部程序集中,您可以通过HttpContext.Current.Session访问会话。否则你的代码会非常相似:

//creating the user info as needed:
UserInfo currentUserInfo = new UserInfo();

//storing the user info:    
HttpContext.Current.Session["UserInfo"] = currentUserInfo;

//getting the user info as needed:
UserInfo currentUserInfo = (UserInfo)HttpContext.Current.Session["UserInfo"];

在对类库进行编码时,建议在尝试访问它之前确保HttpContext.Current不为空Session,因为在某些情况下它可能为空。

以上所有内容都应满足您的需求。按设计进行的会话限定在用户/会话级别,因此您可以在代码中使用相同的会话密钥。无需其他特殊要求即可保护类实例免受其他用户/会话的影响。您提到的Cache对象不是正确的方法,因为它是应用程序范围的,并且需要您实现自己的用户级范围,以确保UserInfo实例不会意外地在不同的位置共享会话。

最后一个建议 - 您甚至可以创建一个静态实用程序/帮助程序类,它将根据需要访问此信息,以便您的代码不会不断地处理Session对象。快速举例:

public static class UserInfoManager
{
    /// <summary>
    /// Gets or sets the session-scoped user info when needed.
    /// </summary>
    public static UserInfo UserInformation
    {
        get
        {
            if(HttpContext.Current != null)
                return (UserInfo)HttpContext.Current.Session["UserInfo"];

            return null;
        }
        set
        {
            HttpContext.Current.Session["UserInfo"] = value;
        }
    }
}

使用上面的静态类,您现在可以使用UserInfoManager.UserInformation等轻松访问该类的实例。

我希望这会有所帮助。

修改

另一个建议。在我们的应用程序中,当我们必须像您一样为每个用户存储类实例时,我们创建了一个基类Page类,它允许通过属性直接访问类实例。这也可以帮助你保持精致:

/// <summary>
/// Base page class, which all pages in our site will inherit from
/// </summary>
public class MyBasePage : System.Web.UI.Page
{
    /// <summary>
    /// Gets or sets the session-scoped user info when needed.
    /// </summary>
    protected UserInfo UserInformation
    {
        get
        {
            if(HttpContext.Current != null)
                return (UserInfo)HttpContext.Current.Session["UserInfo"];

            return null;
        }
        set
        {
            HttpContext.Current.Session["UserInfo"] = value;
        }
    }
}

然后在asp.net网站或Web应用程序的每个代码隐藏中:

/// <summary>
/// Code-behind class for a page in my site
/// </summary>
public partial class SomePage : MyBasePage 
{
    public void Page_Load(object sender, EventArgs e)
    {
        //access the user info as needed
        this.UserInformation.SimplyProperty = "something";
    }
}

如您所见,现在只需要很少的代码就可以访问类实例。

答案 1 :(得分:1)

您必须将其放入Session对象中,该对象会自动为您管理。