Взяв страницу от jfar, я думаю, что наконец-то научился ловить рыбу (или, может быть, бросил свой шест в правильном направлении) по этому вопросу и нашел несколько хороших статей, которые пролили некоторый свет на подробное описание работы схемы Summer of NHibernate. Поиск в Google, чтобы найти больше деталей о NHibernate и Contextual Sessions, помог мне лучше понять тему. Я все еще новичок в NHibernate (и веб-программировании в целом), поэтому, пожалуйста, потерпите меня, если этот вопрос и ответ кажутся элементарными.
Кажется, схема Summer of NHibernate является поточно-ориентированной. Мое объяснение будет ссылаться на имена из моего примера кода выше. Переменная SessionFactory является статической, поэтому она доступна из каждого потока, однако является потокобезопасным объектом (тогда как, как уже упоминалось, ISession не является потокобезопасным). NHibernateSessionPerRequestModule устанавливает два события, которые срабатывают по веб-запросу (Application_BeginRequest) и по окончании одного (Application_EndRequest). Application_BeginRequest получит объект ISession, из которого вы можете затем связать его с текущим контекстом. Это помогает гарантировать, что объект ISession используется во время веб-запроса и только для этого потока. После начала веб-запроса ISession затем можно извлечь с помощью .GetCurrentSession () для использования с _companyRepository. Application_BeginRequest также начнет транзакцию для вас. Application_EndRequest отвяжет объект ISession, зафиксирует все изменения в конце вашего веб-запроса и закроет ISession.
У Питера Вигла есть статья, в которой показан похожий пример того, как реализовать управление сессиями:
http://pwigle.wordpress.com/2008/11/21/nhibernate-session-handling-in-aspnet-the-easy-way
В этой статье Global.asax используется для указания событий для привязки и отмены привязки вместо создания IHttpModule.
У Ayende есть хороший чистый пример, который использует HttpContext для управления вашими ISessions:
http://ayende.com/Blog/archive/2009/08/05/do-you-need-a-framework.aspx
Если я далеко от базы и не понимаю что-то, пожалуйста, не стесняйтесь вставлять, но, насколько я могу судить, поскольку разные ISession привязаны к каждому контексту потока, это будет потокобезопасным (если нет необходимо иметь многопоточную сессию IS.)