Управление сессиями NHibernate Linq - PullRequest
4 голосов
/ 30 июля 2009

Я проверяю 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 .

Ответы [ 2 ]

4 голосов
/ 30 июля 2009

IMO самым простым способом было бы иметь httpmodule, который управляет сессией (шаблон сеанса на запрос), а затем использовать внедрение зависимостей для предоставления ISession контроллерам.

Это в значительной степени подход, используемый S # arp и others .

LINQ для NHibernate построен на основе "стандартного" NHibernate, поэтому все шаблоны управления сеансами по-прежнему применяются.

Хотя у меня нет книги, поэтому я не знаю, сколько нужно изменить ...

0 голосов
/ 02 августа 2009

Rhino Commons тоже решение. Я использую его в приложении ASP.NET MVC отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...