Мне нужно сделать следующее, когда экземпляр класса создан, мне нужно сохранить этот экземпляр пользователем. Поскольку я работаю в asp.net, мне было интересно, следует ли использовать некоторые из способов, которыми asp.net обеспечивает сохранение данных между пользовательскими запросами. (Кэш не может быть из-за того, что данные должны быть постоянными, а состояние приложения не может быть связано с тем, что оно должно быть специфичным для пользователя), или если я должен искать способ сохранить эту информацию внутри класса. И он должен сохраняться до тех пор, пока я программно не скажу так, когда экземпляр класса создается, сохраняя этот экземпляр пользователем
ответ
Сессия - идеальное место для хранения конкретных пользовательских данных.
Предположим, что для этого ответа ваш класс, который необходимо сохранить в сеансе пользователя, называется 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";
}
}
Как вы можете видеть, очень мало кода нужно сейчас, чтобы иметь возможность получить доступ к экземпляру класса.
Вы должны поместить его в объект Session, который автоматически управляется для вас.
# Я никогда не использовал объект Session, вызвав его изнутри класса, можно ли это сделать? Я получаю «Имя сеанса не определено» # Должен ли я беспокоиться об этом? «Объект Session является одним из менее эффективных способов хранения пользовательских данных, поскольку он сохраняется в памяти в течение некоторого времени даже после того, как пользователь прекратил использование приложения». – Pablo
, кстати, данные должны сохраняться до тех пор, пока я программно не скажу так – Pablo
- 1. , когда экземпляр JVM создается?
- 2. Когда создается экземпляр ActionForm?
- 3. Когда экземпляр QBPrivateChat создается локально?
- 4. Как создается экземпляр класса внутри самого класса?
- 5. Как создается экземпляр класса Java Boolean?
- 6. Как создается экземпляр класса контроллера Spring?
- 7. Как создается экземпляр шаблона?
- 8. Найти, где экземпляр класса создается в Eclipse?
- 9. Адрес и этот экземпляр класса?
- 10. BroadcastReceiver не создается экземпляр
- 11. Где m_pMainWnd создается экземпляр
- 12. C2DM: где создается экземпляр C2DMReceiver?
- 13. управляемого экземпляр VM создается пустым
- 14. Ruby - метод класса, возвращающий экземпляр и модифицирующий этот экземпляр
- 15. Когда экземпляр Graphics создан
- 16. При создании экземпляра вложенного класса создается экземпляр класса вложенности?
- 17. Экземпляр класса
- 18. Java ObjectInputStream не создается экземпляр
- 19. Объект XMLHttpRequest не создается экземпляр?
- 20. Actionscript: Я удаляю этот экземпляр класса правильно?
- 21. Ведение журнала: регистрация места, где создается экземпляр класса
- 22. Почему этот экземпляр метода этого класса не принимает этот аргумент?
- 23. Почему этот экземпляр утечки кода класса Sample?
- 24. Вызов методов класса, создавшего этот экземпляр
- 25. В C++, когда можно вернуть экземпляр класса?
- 26. Ввод класса в другой класс, экземпляр которого создается вручную
- 27. Всегда создавайте экземпляр класса?
- 28. Как создать экземпляр класса создается во время выполнения
- 29. Когда будет создан экземпляр контроллера?
- 30. Javascript почему экземпляр не экземпляр объявленного класса?
TY. Похоже, вы собираетесь получить 100 человек. Но я собираюсь подождать и посмотреть, если кто-то другой ответит и пусть голоса решат, кто его получит :) – Pablo
NP. Звучит справедливо для меня .. –