1) Вы, вероятно, хотите немного больше гибкости с точки зрения объема вашей сессии. Взгляните на Каким должно быть время жизни сеанса NHibernate? для получения дополнительной информации
2) Вы могли бы модульно протестировать этот код, предполагая, что вы абстрагировали вызовы sessionFactory, но, опять же, я думаю, что вам следует взглянуть на сессию чуть больше
3) Хороший вопрос с этой реализацией
4) Вы не сможете использовать ThreadStaticSessionContext с веб-приложениями. Скорее всего, вы захотите использовать для этого Session-Per-Request, создавая новый сеанс в начале запроса и удаляя его в конце.
Я бы рекомендовал абстрагироваться от создания ISession с использованием DI. Если ваш код вызывает XYZ.GetCurrentSession () перед выполнением кода, это плохо. Если это создает новый сеанс (только для использования в текущем контексте), это нормально.