Rambler's Top100
Главная
Новости
Статьи
Форумы
Книги
Коды
Сообщество
Блоги
О нас
 

Логин

Email:
  Пароль:

Войти
Зарегистрироваться
Забыл пароль

Поиск

 Искать :
 
Вперед

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)

13 August 2005 21:30 Max951

RE

Сессия в ASP.NET - это пережиток прошлого и пользоваться ею - правило дурного тона. Улыбка
15 August 2005 01:36 Nik Legaloff

RE

Правилом дурного тона считается невнимательно читать посты и писать глупые ответы(в данном контексте).

Прочти ещё раз написаное мной выше и наверно заметешь, что никакой речи о HttpSessionState тут не идёт.
Хотя в одном моменте она всё же упоминается. Там где я предложил использовать её идентификатор(если лень свой механизм реализовывать), при этом идентификатор используется ТОЛЬКО в течении выполнения запроса. Между запросами он не используется и HTTP сессия тоже НЕ используется. Если сесия рухнет между запросами то ничего страшного не произойдёт.
16 August 2005 12:07 Max951

RE

да прошу прощения, не внимательно всё просмотрел
17 August 2005 01:47 Urchik

uuu

2Max951 : а чем плохо использование сессий?
17 August 2005 17:06 Dimon aka Manowar

2 Urchik

Непредсказуемостью наличияУлыбка Это как кеш, только в кеше хоть ожидаешь, что объекта может не быть, а сессия сдохнет тихонечко (сама по себе или вместе с приложением) и никто и не заметитУлыбка
17 August 2005 20:22 Max951

RE 2 Urchik

Единтсвенный момент, когда я пользуюсь сессией - это если мне созданный обьект нужно передать модальному окну и обратно, других надобностей у меня в ней нетуУлыбка
18 August 2005 00:43 Nik Legaloff

Зачем же передавать обьект, когда можно передать его ID. Или если надо то ещё и имя его типа.

Передавать лучше презистентные обьекты
18 August 2005 09:10 Max951

RE: Зачем же передавать обьект, когда можно передать его ID. Или если надо то ещё и имя его типа.

А что мне даст ID Если нужен целиком обьект?Ангел
18 August 2005 09:14 Nik Legaloff

Ну так его можно всегда извлечь из хранилища по ID :)

Ну если уже совсем нельзя ложить его в долговременное хранилище(БД, файл) то можно поместить в статическую коллекцию, к примеру hashTable, сгенерировав для него ключ. и по нему можно обект потом получить.
19 August 2005 17:32 Dimon aka Manowar

Ну на самом деле получается та же сессия

И точно так же, как и сессия статический хеш может упастьУлыбка
Хотя конечно лучше все параметры тягать в запросах к страницам и не пользоваться вспомогательными хранилищами.
23 August 2005 20:01 Игорь Т.

RE: Ну на самом деле получается та же сессия

Ну, это скорее не сессия а кэш получаетсяУлыбка
следи за руками:

1. У нас есть кэш объектов. Identity Map. ВСЯКИЙ объект перед тем, как загрузить проверяем на наличие в кэше. Если нет - грузим. Все это есессн опрозрачно на уровне DAL сделано.

2. Передаем модальному окну ID экземпляра. Окно себе просто просит DAL дать ему экземпляр такой-то. И тот ему дает. А из кэша ли он, или вновь загружается после смерти процесса - окошку как бы до фалды...

Т.е. если просто ложить экземпляр в сессию и ожидать его там найти в модлаьном окне - это плохо. А что делать, если его там нет? Ну, там сессия умерла вместе с процессом и т.д. А вот в случае такой вот вертикальной структуры, как написано выше, все будет зашибись как устойчиво работать


>> Хотя конечно лучше все параметры тягать в запросах к страницам и не пользоваться вспомогательными хранилищами.

это как сказать... хороший кэш еще никому не вредил Подмигивание
23 August 2005 20:06 Игорь Т.

RE Не стоит забывать что вышесказанное эффективно только для webApp. для winApp совсем другая история.

Ну почему же... Разве что некоторыми деталями реализации отличаться будет. А в целом - идея как раз шаблонная и универсальная. Подходит и для win и для web.


К слову, в том же Hibernate объект Session именно все вышеописанное на себя и берет (IdentityMap, UnitOfWork etc). Вот разве что доступность к нему не забита жестко (DataSession.Current).

Это дело оставили разработчикам, чтобы те сами решили, каким именн ообразом манагерить эти сессии: можно одну на HttpContext, можно одну на сессию, можно ассоциировать сессии именно с бизне-транзакциями...
24 August 2005 10:06 Max951

RE:RE: Ну на самом деле получается та же сессия

На самом деле всё почти также как ты описалУлыбка
 
Наш Киев

Apartments for Rent

Rambler's Top100
Рейтинг@Mail.ru
Идея: Dimon aka Manowar Программирование: Dimon aka Manowar Дизайн: Dan Lebedev
Хостинг от компании Parking.ru
Карта сайта