2010-02-15 4 views
1

Мне нужно сделать следующее, когда экземпляр класса создан, мне нужно сохранить этот экземпляр пользователем. Поскольку я работаю в asp.net, мне было интересно, следует ли использовать некоторые из способов, которыми asp.net обеспечивает сохранение данных между пользовательскими запросами. (Кэш не может быть из-за того, что данные должны быть постоянными, а состояние приложения не может быть связано с тем, что оно должно быть специфичным для пользователя), или если я должен искать способ сохранить эту информацию внутри класса. И он должен сохраняться до тех пор, пока я программно не скажу так, когда экземпляр класса создается, сохраняя этот экземпляр пользователем

ответ

7

Сессия - идеальное место для хранения конкретных пользовательских данных.

Предположим, что для этого ответа ваш класс, который необходимо сохранить в сеансе пользователя, называется UserInfo. Первое, что должен убедиться, что он помечен как Serializable, так что его можно хранить в сессии:

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

Из-за кода или классы в папке App_Code приложения ASP.NET, вы можете позвонить непосредственно сеанс:

//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, о котором вы упомянули, не является правильным способом, так как он является широко используемым приложением, и потребовал бы, чтобы вы реализовали свою собственную область пользовательского уровня, чтобы убедиться, что экземпляры не случайно попадают на разные сеансы.

Последнее предложение - вы могли бы создать класс статической утилиты/помощника, который мог бы получить доступ к этой информации по мере необходимости, так что ваш код не будет постоянно иметь дело с объектом 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 и т.д.

Я надеюсь, что это помогает.

EDIT:

Еще одно предложение. В наших приложениях, когда мы должны хранить экземпляр класса для каждого пользователя, как и вы, мы создаем базовый класс 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.нетто-сайт или веб-приложение:

/// <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"; 
    } 
} 

Как вы можете видеть, очень мало кода нужно сейчас, чтобы иметь возможность получить доступ к экземпляру класса.

+0

TY. Похоже, вы собираетесь получить 100 человек. Но я собираюсь подождать и посмотреть, если кто-то другой ответит и пусть голоса решат, кто его получит :) – Pablo

+0

NP. Звучит справедливо для меня .. –

1

Вы должны поместить его в объект Session, который автоматически управляется для вас.

+0

# Я никогда не использовал объект Session, вызвав его изнутри класса, можно ли это сделать? Я получаю «Имя сеанса не определено» # Должен ли я беспокоиться об этом? «Объект Session является одним из менее эффективных способов хранения пользовательских данных, поскольку он сохраняется в памяти в течение некоторого времени даже после того, как пользователь прекратил использование приложения». – Pablo

+0

, кстати, данные должны сохраняться до тех пор, пока я программно не скажу так – Pablo

Смежные вопросы