Могу ли я использовать переменную ASP.NET Session [] во внешней DLL - PullRequest
5 голосов
/ 18 января 2009

У меня есть два проекта: проект DLL, в котором есть вся моя логика и доступ к данным, и проект ASP.NET, который выполняет мои формы и т. Д.

Я немного смущен. Я подумал, что если я добавлю ссылку на пространство имен System.Web в проект DLL, я смогу ссылаться на информацию о состоянии сеанса на странице ASP.NET.

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

Возможно ли это?

Я возился с пространством имен System.Web и, похоже, смог получить ссылку на переменную Session.

Спасибо всем.

Jon

Ответы [ 5 ]

11 голосов
/ 18 января 2009

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

Хотя этот тип жесткой связи не очень рекомендуется.

10 голосов
/ 18 января 2009

Вы должны иметь возможность использовать HttpContext.Current.Session

Редактировать

Хотя да, я согласен, что вам не следует тесно связывать ваши сборки Business Logic DAL или других сборок с сеансом ASP.Net. Существует множество действительных случаев доступа к HTTP-контексту вне веб-проекта.

Web Controls - это, вероятно, один из лучших примеров, многократно используемые модули http и т. Д. И т. Д. *

Теперь одним из вариантов, если вы хотите, чтобы ваша DLL извлекала материал из Session, является абстрагирование сессии. Таким образом, вы можете определить интерфейс, такой как IStorage, который ваша библиотека будет знать, как использовать. Затем вы можете иметь класс SessionStorage или MemoryStorage и использовать IoC для внедрения подходящего класса в ваши библиотечные классы. Это дает вам свободу кодировать его так, как вы хотели, чтобы он был закодирован без привязки вашего кода к Session. Да, и еще одно преимущество, если все сделано правильно, также может использоваться, чтобы не привязывать ваш код к сеансу в Интернете.

2 голосов
/ 18 января 2009

Как говорят другие, вы всегда можете использовать HttpContext.Current.Session в вашей DLL, я полагаю, что это ваш BAL, но вам нужно быть очень осторожным. Что если ваша DLL позже будет использована службой Windows или другим приложением, не имеющим HTTPContext? Всякий раз, когда я делал это, он всегда находился в методе get свойства, где я оборачиваю попытку доступа к HttpContext.Current.Session в блок try try, и если что-то идет не так, я переполняю необходимые данные из базы данных.

2 голосов
/ 18 января 2009

Вы всегда можете использовать HttpContext.Current.Session в вашей DLL, но это считается плохой практикой. Лучшим подходом было бы передать значения, хранящиеся в словаре сеанса, в вашу DLL вместо того, чтобы ссылаться на сеанс. Еще одно преимущество, которое вы получите, заключается в том, что код в вашей DLL не будет связан со средой выполнения ASP.NET, а значит, его будет проще тестировать.

1 голос
/ 10 апреля 2013

Не используйте HttpContext.Current.Session, поскольку ваша dll не всегда будет работать с веб-приложением. Он может работать с любым другим приложением, таким как Windows, консоль и т. Д.

Лучше использовать метод, который на самом деле принимает параметр, который придет из значения сеанса, если вы используете приложение ASP.Net, иначе не будет никакой зависимости приложения. Если ваш dll-проект уже разработан и вы пытаетесь изменить существующую бизнес-логику, то нет, не изменяйте существующий метод, используйте метод Overload.

...