私はいくつかの基本的な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.