Глобальные переменные и состояние сеанса ASP.NET

Возможно, это прозвучит довольно наивно, но я разрабатываю веб-приложение, охватывающее несколько страниц. Все эти страницы создают экземпляры одного и того же объекта класса с методами, которые обращаются к CMS с помощью их API. В настоящее время, когда пользователь начинает создавать контент, я сохраняю такие переменные, как идентификатор папки, в которой контент находится в переменной сеанса.

У меня такой вопрос: могу ли я создать один экземпляр класса, который можно использовать на всех страницах, без необходимости делать это на каждой странице? Если да, будет ли каждому человеку, обращающемуся к этой странице, будет предоставлена ​​собственная версия класса? Я предполагаю, что использование статических переменных и методов - это не выход, поскольку они совместно используются в памяти. А также, где / как что-то объявляется, если оно будет использоваться глобально в веб-приложении в приложении .net C #?


person Anthony Levine    schedule 20.07.2011    source источник
comment
Был задан аналогичный вопрос, и я думаю, что этот ответ в значительной степени резюмирует все ваши варианты.   -  person Samuel Béliveau    schedule 21.07.2011
comment
возможный дубликат Cache VS Session VS cookies?   -  person Gabe    schedule 21.07.2011
comment
А также, где / как что-то объявляется, если оно будет использоваться глобально в веб-приложении в приложении .net C #? Возможно, вы захотите немного прояснить этот вопрос. Вы, безусловно, можете определять классы в конкретной сборке и ссылаться на эту сборку при создании веб-сайтов ASP.NET, веб-сервисов, консольных приложений и т. Д. ОДНАКО, если вам нужны разрозненные приложения для совместного использования определенного ЭКЗЕМПЛЯРА класса, вам, вероятно, нужно посмотреть в .NET удаленное взаимодействие или аналогичные методы.   -  person mikemanne    schedule 21.07.2011


Ответы (4)


Я рекомендую создать базовый класс, унаследованный от System.Page. Затем унаследуйте код вашей страницы от этого.

Затем внутри базового класса создайте свойство, которое является ссылкой на ваш объект. Вот так, например:

public class BasePage : System.Web.UI.Page
{
    public Foo CurrentFoo
    {
        get
        {
            return (Foo)Session["FooSessionObject"];
        }
        set
        {
            if(Session["FooSessionObject"] == null)
            { 
                // instantiate a new one
                Session["FooSessionObject"] = new Foo();
            }
            Session["FooSessionObject"] = value;
        }
    }
}

Затем из любого места на любой странице просто выполните CurrentFoo. и у вас будет доступ к любому из свойств.

Это делает код позади красивым и чистым.

person Bill Martin    schedule 20.07.2011
comment
Лично мне нравится этот ответ, он очень чистый. Я собираюсь его использовать. Спасибо! - person Mausimo; 17.03.2012
comment
@ Билл Мартин - должна ли проверка на null для сеанса [FooSessionObject] отсутствовать в операторе get? get {if (Session [FooSessionObject] == ​​null) {// создать новый экземпляр Session [FooSessionObject] = new Foo (); } return return (Foo) Session [FooSessionObject]; - person Mark; 07.07.2015

Вы должны использовать состояние Session, если хотите хранить только конкретную информацию текущему пользователю.

Например, на одной странице приложения вы можете сохранить какое-то значение в сеансе:

SomeType someValue = ...
Session["someKey"] = someValue;

а затем позже на другой странице извлеките его из сеанса:

SomeType someValue = (SomeType)Session["someKey"];
person Darin Dimitrov    schedule 20.07.2011

Шаблон, который вы ищете, довольно прост. Есть несколько способов добиться этого.

  1. Создать объект и сохранить его в сеансе
  2. Создайте форму, состоящую из нескольких частей, и оставьте элементы в режиме просмотра

У каждого есть свои преимущества.

person Gregory A Beamer    schedule 20.07.2011

Плохая вещь в том, чтобы делать это и использовать глобальные сеансы для веб-сайта, потому что к глобальным переменным может получить доступ любой пользователь, независимо от сеанса. Например, возьмите приведенный ниже код.

   public class globals
    {
        static string _test = "MyTest";
        public static string test 
        {
            get
             {
                return _test;
             }
            set
             {
                _test = value;
             }
        }

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

protected void Page_Load(object sender, EventArgs e)
    {
        globals.test = "Some Data";
    }

теперь вы увидите это на каждой странице вашей страницы, но с другой стороны, любой, кто имеет доступ к вашей странице, также сможет увидеть эти данные. Если его данные должны быть разделены между несколькими сеансами, вы можете это сделать. Если его данные просто должны быть разделены текущим пользователем по нескольким классам, вам необходимо использовать переменные сеанса.

person o0knight0o    schedule 11.04.2014