Переменные области видимости .Net? - PullRequest
1 голос
/ 25 января 2011

Я новичок в .net, и я использую MVC2 + linQ и C #

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

Мне это нужно для хранения данных из разных таблиц sql, связанных с зарегистрированным пользователем

Заранее спасибо

Ответы [ 5 ]

3 голосов
/ 25 января 2011

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

Session["MyData"] = myData;
MyDataType myData = (MyDataType)Session["MyData"];

Очевидно, что следует соблюдать осторожность с размером объектоввы храните и как обрабатываются данные сеанса, т. е. в процессе, на SQL Server или на сервере приложений.Если вы не храните данные сеанса в памяти, вам нужно убедиться, что они сериализуются.

2 голосов
/ 25 января 2011

Да, поскольку это данные в области сеанса, сеанс будет в том месте, где эти данные будут помещены, в этом нет ничего плохого.

Единственный недостаток, который я могу видеть, заключается в том, что если время сеанса истекает, вы теряете эти данные - поэтому, если вы хотите сохранить эти данные (а не только данные только для чтения или временные данные), вы, вероятно, захотите сохранить вместо этого укажите в вашей БД.

1 голос
/ 25 января 2011

Как уже говорили другие, синтаксис прост, вы можете просто рассматривать Session как хэш-карту или словарь, если хотите.

Session["userData"] = userData;
UserInfo userData = Session["userData"] as UserInfo;

Обратите внимание (так как вы новичок в C #), что ключевое слово "as" - это, по сути, обнуляемое приведение; если приведение не выполнено, ваша переменная userData будет иметь значение null.

Для дополнительного кредита (и в зависимости от требований вашего приложения) вы можете обернуть весь доступ к данным в объект DAO или репозиторий, и этот объект будет использовать Session изнутри. Расположение хранилища данных - это деталь реализации, в которой сам контроллер не нуждается; извлечение его из сеанса с использованием базы данных (или XML-файла, или статических объектов в памяти, или чего-либо еще) не должно иметь отношения к контроллеру (основной задачей которого является управление потоком приложений).

1 голос
/ 25 января 2011

Краткий ответ: вы не должны использовать глобальные переменные - они работают только во время одного запроса. Таким образом, вам придется использовать свойство Session.

Но вы все равно должны избегать его использования ИМХО.

И вы всегда можете использовать член UserData формы заявки , если вы хотите, чтобы пользовательские данные были связаны с вошедшим в систему пользователем.

Редактировать : Я не из англоговорящей страны, поэтому иногда я использую «не могу», когда мне следует использовать «не должен». Чтобы избежать повторного голосования, давайте кое-что проясним здесь - конечно, вы можете использовать глобальные переменные в многопоточном веб-приложении. Это просто не очень разумно, так как все объекты, на которые есть ссылки, будут потеряны в конце запроса. Но не стесняйтесь делать это.

1 голос
/ 25 января 2011

Контроллеры воссоздаются для каждого запроса, поэтому, если вы хотите сохранить что-то для сеанса, да, вам нужно сохранить это в Session["key"].

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...