Могу ли я использовать ASP.NET Переменную Session[] во внешней библиотеке DLL
-
19-08-2019 - |
Вопрос
У меня есть два проекта, проект 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 уже разработан, и вы пытаетесь изменить существующую бизнес-логику, то нет, не изменяйте свой существующий метод, используйте метод перегрузки.