Как предоставить объект Session / Host для использования как в Windows, так и в веб-приложении?
-
04-07-2019 - |
Вопрос
У меня есть веб-приложение, которое интенсивно использует состояние сеанса для хранения информации о текущем пользователе, его личных настройках, записи истории сеансов и т. д. Р>
Я обнаружил, что извлекаю информацию о сеансе на бизнес-уровне, например так:
((UserSession)HttpContext.Current.Session["UserSession"]).User.Info
Это создает проблему - в какой-то момент в будущем мое приложение будет иметь клиент Windows, который явно не может ссылаться на состояние веб-сеанса. Поэтому мне нужен хост или настроенный класс сеанса, на который я могу ссылаться на бизнес-уровне, независимо от того, запущено ли приложение в Интернете или на рабочем столе. Что-то вроде:
IHost.User.Info
За кулисами веб-реализация, очевидно, будет использовать состояние сеанса для хранения информации, но мне нужно скрыть это от своего бизнес-уровня. Кто-нибудь решил эту проблему или получил практический совет о том, как лучше к этому подойти?
Помощь приветствуется. Р>
Решение
Если предположить, что бизнес-уровень представляет собой отдельную 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;
}
}
}
Другие советы
Потребуется некоторая реорганизация, но если вы переключитесь с использования состояния сеанса на профили пользователей, вы сможете использовать службы клиентских приложений для обмена информацией.
Полагаю, вам нужно создать веб-сервис или сервис RESTfull. Служба вернет файл XML, представляющий информацию о вашем пользователе. Вы сможете вызвать службу из ваших окон или веб-приложения. Р>