|
|
|
 |
 |
Nik Legaloff Blog. Сессия работы с данными |
 |
|
 |
 |
Для тех, у кого возникает потребность в определении области, легко доступной из любого участка кода, которая живёт на протяжении всего реквеста и является уникальной для каждого клиента.
Пишла в голову идея, реализацией которой я давно пользуюсь. Сча решил ей поделиться.
Для чего нужна такая сессия?
1. В ней удобно хранить свой connectionManager, который будет раздавать соединения именно для этого клиента.
2. Её легко по событию OnUnload(перегрузить его в своём базовом типе страницы) или по Application_EndRequest можно закрывать и не бояться забыть это сделать явно. При закрытии можно высвобождать занятые ресурсы(если их учёт ведёт обьект, лежащий в датаСессии) можно камитить по умолчанию все бизенес транзакции.
3. Там же место экземпляру UnitOfWork и IdentityMap
4. Она может быть легкодоступна (DataSession.Current.)
Реализация проста.
Статическое поле - hashtable в котором лежат сами сессии, а key у элемента hashtable - любой уникальный идентификатор клиента(в самом простом случае идентификатор сессии, но можно реализовать и свой механизм)
2 статических метода.
1. Получить экземпляр текущей сесии(если таковой отсутсвует - создать новый)
2. Закрыть текущую сессию( и удалить её из коллекции)
ну а в самом класе datasesion ложим экземпляры нужных обьектов и делаем к ним проперти. Если используем бизнесТранзакцию то реализуем свои методы, типа Commit(), Rollback()
Кстати удачно получается реализация Rollback, при этом просто сбрасывается UnitOfWork и очищается IdentityMap. Опля, и все действия забыты
пример реализации Сессия работы с данными для web
ЗЫ. Не стоит забывать что вышесказанное эффективно только для webApp. для winApp совсем другая история.
Nik Legaloff
11 August 2005 19:15 Комментарии (13)
|
|
|
|
 |
 |
 |
 |
|
|