私は現在、永続層としてNHibernateを使用してASP.NETMVCプロジェクトを構築しています。
今のところ、いくつかの機能が実装されていますが、ローカルNHibernateセッションのみを使用します。データベースにアクセスした(読み取りまたは書き込み)各メソッドは、「using()」句を使用して独自のNHibernateセッションをインスタンス化する必要があります。
問題は、NHibernateの遅延読み込み機能を利用して、プロジェクトのパフォーマンスを向上させたいということです。
これは、ビューがレンダリングされるまで、リクエストごとにNHibernateセッションが開いていることを意味します。さらに、同時リクエストをサポートする必要があります(同時に複数のセッション)。
どうすればそれをできるだけきれいに達成できますか?
Webを少し検索して、リクエストごとのセッションのパターンについて学びました。私が見た実装のほとんどは、セッションを格納するためにある種のHttp *(HttpContextなど)オブジェクトを使用していました。また、Application_BeginRequest / Application_EndRequest関数の使用は複雑です。これは、リクエストごとに1回だけセッションをインスタンス化する場合に、HTTPリクエスト(aspxファイル、cssファイル、jsファイルなど)ごとに起動されるためです。
私が懸念しているのは、ビューまたはコントローラーがNHibernateセッション(または、より一般的にはNHibernate名前空間とコード)にアクセスできないようにすることです。つまり、コントローラーレベルでもビューレベルでもセッションを処理したくないということです。
私はいくつかのオプションを念頭に置いています。どれが一番いいと思いますか?
- コントローラーアクションの前後にトリガーされるインターセプター(GRAILSなど)を使用します。これらは、セッション/トランザクションを開いたり閉じたりします。これはASP.NETMVCの世界で可能ですか?
- WebコンテキストでNHibernateによって提供されるCurrentSessionContextシングルトンを使用します。このページを例として使用すると、これは非常に有望だと思いますが、それでもコントローラーレベルでのフィルターが必要です。
- HttpContext.Current.Itemsを使用して、リクエストセッションを保存します。これは、Global.asax.csの数行のコードと相まって、リクエストレベルでのセッションを簡単に提供できます。ただし、これはNHibernateと私のビュー(HttpContext)の間に依存関係が注入されることを意味します。
どうもありがとうございます!