C # Хранение альтернативного текста в переменной сеанса или извлечение из базы данных - PullRequest
2 голосов
/ 02 марта 2010

Я создаю веб-систему, и различные клиенты будут иметь альтернативный текст для экземпляров по умолчанию на всем сайте. Одно место - главная навигация, но есть и другие. По умолчанию это может быть «проект», но они могут назвать его «событие».

Я иду по пути вызова всех настроек терминологии (всего их около 15) и создания ArrayList с идентификатором и значением по умолчанию или их заменой в качестве элементов в ArrayList.

У меня также есть список ключей enum с именем TermKey, который имеет значения по умолчанию и соответствующий идентификационный номер.

Во всем коде я буду ссылаться на TermKey.Project, а затем делать одну из этих вещей, которые я вижу в качестве параметров. 1 извлеките текст из сеанса (если клиент установил его в «событие», то текст «событие» будет ожидать вызова там) 2 извлекайте текст из базы данных каждый раз, когда мне это нужно. 3 При каждом загрузке страницы тяните список клиентов.

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

Ответы [ 5 ]

2 голосов
/ 02 марта 2010

Сессия не лучшее место для такого рода информации. Хотя да, это привязано к пользователю, состояние сеанса действительно является хранилищем для привязанной к пользователю привязанной к сеансу информации. Похоже, у вас есть информация, которая действительно выходит за рамки сеанса.

Лучший способ отразить эту информацию - это использовать пользовательский ASP.NET Profile Provider . Вы можете использовать его для предоставления свойств информации, которую вам необходимо предоставить, тогда как логика в свойствах будет обрабатывать установку значений на соответствующие значения на основе пользователя в вашей системе (или анонимного пользователя, если они не аутентифицированы). .

В вашем случае вы можете кэшировать значения и обращаться к базе данных по мере необходимости в поставщике профилей.

Затем эта информация предоставляется через свойство Profile в классе HttpContext (а также через свойство Profile в классе HttpProfileBase , если вы используете ASP.NET MVC) .

1 голос
/ 02 марта 2010

Сессия в порядке, если вы хотите сохранить ее между сеансами (и это не слишком много данных). Другим вариантом будет печенье. Я бы рекомендовал при запуске сеанса создавать экземпляры переменных сеанса в свойстве объекта User, а затем ссылаться на User.DefaultText

1 голос
/ 02 марта 2010

В любом случае вы не должны вызывать DB на каждой странице, чтобы получить альтернативный текст. Я думаю, что это хорошо для хранения их в сессии, если их не слишком много (на пользователя)

1 голос
/ 02 марта 2010

То, как я делал это в прошлом, - это создать таблицу кодов типа базы данных, а затем таблицу перевода для конкретного клиента, например:

TABLE ObjectType
ObjectTypeCode

TABLE ClientObjectTypeTranslation
ClientId
ObjectTypeCode
OverrideDescription

Это позволяет моему коду всегда ссылаться на то, что я знаю (т. Е. ObjectTypeCode), а затем я присоединяюсь к таблице перевода при каждом запросе и отображаю описание переопределения там, где это необходимо.

Хотя, это может быть излишним для вашего сценария.

0 голосов
/ 02 марта 2010

Если это характерно для каждого пользователя, вы также можете использовать сеанс. Не злоупотребляйте (и используйте его только для небольших объемов данных).

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

Сказав это, использование сессии InProc ограничит вас одним сервером и не позволит вам масштабироваться до веб-фермы.

...