Как предоставить объект Session / Host для использования как в Windows, так и в веб-приложении? - PullRequest
2 голосов
/ 25 октября 2008

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

Я обнаружил, что извлекаю информацию о сеансе на бизнес-уровне, например:

((UserSession)HttpContext.Current.Session["UserSession"]).User.Info

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

IHost.User.Info

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

Помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 25 октября 2008

Если предположить, что бизнес-уровень представляет собой отдельную DLL, я бы никогда не добавил ссылку на System.Web и, следовательно, никогда не использовал бы объект Session напрямую. Это привело бы к другому дизайну бизнес-уровня и открытых интерфейсов для клиента (веб или winforms).

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

((UserSession) DualContext.Current["UserSession"]).User.Info

и реализация оболочки будет выглядеть примерно так (не завершена и не протестирована):

public class DualContext 
{
   private Dictionary<string, object> winFormsSession = new Dictionary<string, object>();
   private static readonly DualContext instance = new DualContext();

   public static DualContext Current
   {
      get {  return instance; }
   }

   public object this[string key]
   {
      get 
      {
         if (HttpContext.Current != null)
            return HttpContext.Current.Session[key];
         else
            return winFormsSession[key];
      }
      set 
      {
         if (HttpContext.Current != null)
            HttpContext.Current.Session[key] = value;
         else
            winFormsSession[key] = value;
      }
   }
}
2 голосов
/ 25 октября 2008

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

http://msdn.microsoft.com/en-us/library/bb384297.aspx

0 голосов
/ 25 октября 2008

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

...