Один из подходов, о которых я слышал, - это использовать nHibernate для взаимодействия с моделью вашего домена. Имейте в виду, что nHibernate может вызывать хранимые процедуры, поэтому, если вы хотите избежать генерации SQL, вы можете, но я бы не советовал.
Если у вас есть запросы на создание отчетов или отображение данных, из которых вы не хотите создавать пользовательские объекты, вы можете использовать DAAB, хотя я бы не рекомендовал делать это, если вы собираетесь создавать свои объекты.
Что касается передового опыта, я обнаружил, что, создавая сеанс, когда он вам нужен, и затем сохраняя его в httpContext, вы будете закрывать сеанс при каждом запросе.
Единственное, что нужно сделать, - это специально создать и завершить транзакцию, которую я сделал бы на вашем уровне обслуживания или уровне приложения, если бы ваша логика охватывала несколько служб (я определяю службу не как веб-службу, а как часть высокого уровня код, который защищает ваше приложение от уровня вашего домена).
Хорошей отправной точкой является статья Билли МакКафферти: http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx
Существует ошибка / ограничение в его коде, проверьте мой блог, если вы используете его метод: http://jberke.blogspot.com/2008/10/nhibernate-transaction-session-mgmt.html