Я проверяю Linq для NHibernate 2.1 для использования в приложении ASP.NET MVC, и я пытаюсь понять управление сессиями. В качестве первого эксперимента я пытаюсь изменить приложение SportsStore с Pro ASP.NET MVC Framework . В этом примере приложения используется Linq to Sql, поэтому я подумал, что это будет хорошим упражнением. У меня есть доступ к базе данных через NHibernate 2.1, и запросы, не относящиеся к Linq, работают нормально.
В Linq to SQL мы можем создать объект IQueryable из контекста данных и строки соединения, которые можно передавать и использовать, не беспокоясь о поддержании какого-либо контекста.
Так, например, исходный код репозитория продукта выглядит примерно так:
public IQueryable<Product> Products
{
get { (new DataContext(_connectionString)).GetTable<Product>();
}
и приложение использует возвращенный IQueryable для заполнения списков продуктов, получения сведений о продукте и т. Д.
В NHibernate Linq аналогичным образом использует контекст данных, но вместо строки подключения мы предоставляем объект сеанса, который должен оставаться в области действия, пока используется IQueryable:
IQueryable<Product> products = new SportsStoreContext(session).Products;
Так что мне интересно, как я должен управлять этим сеансом, не прилагая слишком много усилий к структуре примера приложения. В идеале я хотел бы получить решение, которое позволило бы мне заменить код Linq на Sql на NHibernate Linq, внося только локальные изменения.
Сессия NHibernate реализует IDisposable, и большинство примеров NHibernate демонстрируют управление сессиями с помощью конструкции {}, но эта стратегия здесь не сработает. В этой теме обсуждаются некоторые различные подходы, S # arp Architecture и HybridSessionBuilder . Кто-нибудь использует их для замены Linq на Sql на NHibernate Linq? Есть ли другие методы, которые будут работать лучше?
** EDIT
У Мауша это правильно - общий подход к этому - использование httpmodule. NHibernate в действии описывает два способа сделать это: сеанс на запрос (p334) и сеанс на разговор (p340). Последний позволяет повторно использовать постоянные экземпляры в нескольких HTTP-запросах. В дополнение к предоставленным ссылкам, NHibernate в действии упоминает NHibernate Burrow , Castle ActiveRecord и Rhino Tools .