2009-03-16 3 views
8

私はいくつかの基本的なGet/Save/Deleteメソッドを定義するリポジトリクラスを持っています。これらの中で、私は自分のビジネスエンティティの仕事をするためにNHibernateを使います。たとえば:リポジトリモデルでNHibernateを使う最良の方法

Public Class SecurityRepositoryNHibImpl : Implements ISecurityRepository 
    Public Function GetUser(ByVal UUID As System.Guid) As Entities.User Implements ISecurityRepository.GetUser 
     Dim eUser As Entities.User 
     Using session As ISession = NHibernateHelper.OpenSession() 
      eUser = session.Get(Of Entities.User)(UUID) 
     End Using 
     Return eUser 
    End Function 
End Class 

しかし、私のUserクラスに私はいくつかのプロパティと理想的に私は遅延ロードになりたい他のオブジェクトのコレクションを持っています。もちろん、ISessionはリポジトリ内に作成され、リポジトリ内に配置されています。なぜなら、それらのプロパティにアクセスしようとすると、「プロキシを初期化できませんでした - セッションがありません」というエラーが発生します。

私の唯一の選択肢は、リポジトリを使用するときに遅延読み込みを無効にすることですか?または、ビジネス・レイヤーのスコープにセッションを何とかしてもらうことは可能でしょうか(ちょっとばかげて)?

私はリポジトリモデルが好きですし、NHibernateは私の上で成長しています(最初の多くの不満の後にうまくいっています)。

NHibernateとリポジトリモデル(私たちは主にVB6を主に使用しています!)にはかなり新しく、愚かな疑問があるかもしれません。ありがとう。


@mookid:ありがとう男は、それは本当に便利だが、私はそれが少し長く開いたままになることがあります。これはWCF Webサービスのバックエンドであり、すべての関数が呼び出しごとのコンテキストになるため、呼び出しごとのセッションライフが良好になります。ビジネスレイヤーでそのようなことをどうやって動作させるか分かりません。理想的には、ビジネスオブジェクトがすべてのNHibernateクラスと直接インターフェースする必要はありません。私はNHibernateセッションのためのラッパーのいくつかの種類が少なくともそれを抽象化していると思います... うーん、あなたは私を正しい軌道に乗せました。


ここでのキーワードは、資源のトンがNHibernateのに関連して、ウェブ上に存在しているため、「作業単位」、であるように見えます。特に、Rhino CommonsでAyende's implementationを探し、彼のApp Architectureウェブキャスト(no. 9 at Hibernating Rhinos)を非常に参考にしてください。 but I was soon corrected.

答えて

12

あなたのISessionを作成し、そのようなリポジトリ内に明示的に配置することは、小さくて非常に単純なプロジェクトではうまくいきます。しかし、私は最初に混乱しました。あなたが知っているように、NHibernateがサポートしているクールな機能のいくつかを使いたいと思っているときには、それは短いです。

おそらくセッションのライフスタイルをリポジトリ外のもので制御する必要があります。 ASP.NET Webアプリケーションを実行している場合は、Webリクエストの間、現行のリクエスト(正確にリコールすればHttpContext.Current.Items)にセッションを保存してから、リクエストの最後にコミットして処分することができます例外が発生した場合)。

ASP.NETアプリケーションでセッションのライフスタイルを制御する最適な方法はわかりませんが、各要求の最初と最後にコードを呼び出す方法が必要です。 ASP.NET MVCでは、OnActionExecutingOnActionExecutedのメソッドをオーバーライドしたベースコントローラからすべてのコントローラを派生させることで、簡単に実現できます。

関連する問題