Могу ли я использовать ASP.NET Переменную Session[] во внешней библиотеке DLL

StackOverflow https://stackoverflow.com/questions/454187

Вопрос

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

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

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

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

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

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

Джон

Это было полезно?

Решение

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

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

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

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

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

Другие советы

Пока Сборка загружена в рамках Сеанса, у нее будет доступ.

Хотя на самом деле этот тип плотного соединения не рекомендуется.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top