Спасибо всем за помощь. Немного больше исследований привело меня к проекту NHibernate Burrow.
Из проекта FAQ (http://nhforge.org/wikis/burrow/faq.aspx):
Burrow - это легковесное промежуточное ПО, разработанное для поддержки приложений .Net, использующих NHibernate (возможно, также упоминаемый как NH в этой статье) в качестве платформы ORM. Использование Asp.net с NHibernate может быть проблемой из-за того, что NHibernate является средой с состоянием, а Asp.net - средой без сохранения состояния. Burrow может помочь разрешить этот конфликт, предоставляя расширенное и интеллектуальное управление сеансами / транзакциями и другие средства.
Мне пришлось прыгнуть через несколько обручей, чтобы заставить его работать в моем проекте. Поскольку в текущем выпуске используется старая версия NHibernate, мне пришлось загрузить последний источник из ствола, открыть в VS, добавить ссылки на последнюю версию NHibernate и перекомпилировать (к счастью, без ошибок).
Я тестировал NHibernate Burrow несколькими способами.
1) Продолжить внедрение ISession в мои репозитории
Для этого мне пришлось добавить ссылки на NHibernate, NHibernate.Burrow и NHibernate.Burrow.WebUtil в мой проект MVC.
В web.config мне пришлось настроить Burrow (см. http://nhforge.org/wikis/burrow/get-started.aspx), а затем в моем реестре StructureMap добавить следующее:
For<ISession>()
.TheDefault.Is
.ConstructedBy(x => new NHibernate.Burrow.BurrowFramework().GetSession());
Мне нравится этот подход, так как он означает, что мои репозитории (или контроллеры) не связаны с Burrow. Мне не очень нравится тот факт, что я должен ссылаться на эти три сборки в своем веб-проекте, но по крайней мере я теряю код для управления сессией - все это обрабатывает Барроу.
2) Второй подход заключается в том, чтобы установить ISession в моих конструкторах репозитория следующим образом:
public ProductRepository() :
this(new BurrowFramework().GetSession()) { }
public ProductRepository(ISession session) {
_session = session;
}
Я все еще могу переопределить ISession, делая мои репозитории тестируемыми. У меня тогда есть прямая зависимость от Норы, но, может быть, это не так уж плохо?
С другой стороны, единственная сборка, на которую мне нужно сослаться из моего веб-проекта, - это NHibernate.Burrow.WebUtils.
Интересно посмотреть, на кого из этих двух людей пойдет и почему.