2009-07-30 14 views
4

私はLinq for NHibernate 2.1をASP.NET MVCアプリケーションで使用するのをチェックしています。セッション管理を理解しようとしています。最初の実験として、SportsStoreアプリケーションをPro ASP.NET MVC Frameworkから変更しようとしています。このサンプルアプリケーションはLinq to Sqlを使用しているので、良い演習になると思いました。私はNHibernate 2.1データベースにアクセスし、Linq以外のクエリはうまく動作します。NHibernate 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サンプルはセッション管理をusing {}コンストラクタで示していますが、この戦略はここでは機能しません。 This threadは、いくつかの異なる手法、S#arp ArchitectureおよびHybridSessionBuilderについて説明しています。 LinqをSqlに置き換えるためにこれらを使っている人は誰でもNHibernate Linqを使っていますか?よりうまくいく他の方法がありますか?

** EDIT mauschは正しかった - これにアプローチする一般的な方法はhttpモジュールである。 NHibernate in Actionには、これを行う2つの方法が記載されています。要求ごとのセッション(p334)と会話ごとのセッション(p340)です。後者は、複数のHTTPリクエストにわたって永続的なインスタンスを再利用することを可能にします。 mauschが提供するリンクに加えて、NHibernate in ActionにはNHibernate BurrowCastle ActiveRecord、およびRhino Toolsが含まれています。

答えて

4

IMO最も簡単な方法は、セッション(要求ごとのセッションパターン)を管理し、依存関係注入を使用してコントローラにISessionを供給するためのhttpmoduleを持つことです。

これはかなりthe approach used by S#arpothersです。

NHibernate用のLINQは、 "標準" NHibernateの上に構築されるため、すべてのセッション管理パターンがそのまま適用されます。私は変更しなければなりませんどのくらいかわからないけれども

が本を持っていない...

+0

あなたはmauschです。私はコードを実験し、NHibernate in Actionを読んでいます。私はちょうどこのパターンを説明する第10章(永続性のための建築パターン)を見てきました。 – keithm

0

Rhinoのコモンズはあまりにソリューションです。私はASP.NET MVCアプリケーションでうまく動作します。

+0

Rhino Commonsでは、webappが本当にajaxyの場合、複数の同時セッションを行うコードです。このコードでは、セッショントークンを各リクエストとともに渡すことができるため、同じユーザーが異なるトランザクションを同時に実行できるようになります。クレイジーさ。 –