1

Web リクエストごとにセッションを処理するように NHibernate を設定しようとしています。リポジトリが使用されたときにセッションを初期化するプロジェクトがあります。Web リクエストごとにセッションを管理する最良の方法を知りたいです。私のアーキテクチャは分離されているため、Web プロジェクトでセッションを開いたり閉じたりすることは避けたいと思います。Web プロジェクトに NHibernate の存在を知らなくても、これを処理する良い方法はありますか?

これは私のリクエストフローです:

Web リクエスト -> ASP.NET MVC 3 -> コントローラー -> サービス -> リポジトリ (セッションを開く) -> NHibernate -> データベース -> MVC に戻って外に出ます。

4

2 に答える 2

2

S#arp アーキテクチャをご覧ください。これは、NHibernate をラップし、これと他の機能を提供するフレームワークです。これは、Castle Windsor や Ninject などの依存性注入コンテナーでも実行できます。(S#arp は Castle Windsor を使用しています)。

これを自分で行う場合はHttpModule、各 Web 要求の開始時と終了時にセッションを開いたり閉じたりする を作成する必要があります。リクエストの開始時に、モジュールはセッションを開き、HttpContext.ItemsWeb リクエストごとのストレージである にそれを隠します。リポジトリは、リクエストの処理中にここからセッションを取得します。(クリーンな設計のためにISessionManager、リポジトリが使用するインターフェースと、リクエストごとのストレージにアクセスする実装を作成します。そうすれば、単体テストが可能になります。)最後に、モジュールはリクエストの最後にセッションをフラッシュして閉じます。これは NHibernate プロジェクトで 1 回行いましたが、教育的なものでしたが、大変な作業でした。

S#arp は、多くのアプリケーション構造を決定する大きなフレームワークです。そこまで行きたくない場合は、Castle Windsor を見て、これをきれいに抽象化してください。必要なのは (多かれ少なかれ) コンテナーを構成して、要求ごとの NHibernate セッション オブジェクトをコンストラクター パラメーターとして使用してリポジトリーをインスタンス化することだけです。本当に方法を知りたい場合は、独自の HttpModule を構築してください。ただし、運用環境でフレームワークを使用することをお勧めします。

于 2012-07-31T18:36:49.250 に答える
0

これは、IoC コンテナー (Castle Windsor) を使用してリクエストごとのセッションを実現する方法に関する優れた記事ですhttp://blog.xelibrion.com/journal/2011/4/16/nhibernate-session-management-in-aspnet-mvc-application .html

于 2012-08-01T12:15:56.823 に答える