У меня есть класс репозитория, который определяет некоторые базовые методы 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, и все функции будут иметь контекст для каждого вызова, поэтому время сеанса для каждого звонка будет хорошим. Просто не уверен, как добиться такой работы на бизнес-уровне, в идеале я не хочу, чтобы бизнес-объекты должны были напрямую взаимодействовать с любыми классами NHibernate. Я предполагаю, что какая-то оболочка для сеанса NHibernate, по крайней мере, абстрагирует ее ... Хм, ты по крайней мере поставил меня на правильный путь.
Похоже, ключевым словом здесь является «Единица работы», для которых тонна ресурсов существуют в Интернете по отношению к NHibernate. В частности, обратите внимание на Ayende's implementation в Rhino Commons и его веб-приложение App Architecture (no. 9 at Hibernating Rhinos), очень информативное. Первоначально я был смущен, потому что, хотя я помещал «Бизнес-единицы» в бизнес-уровень, смешал проблемы, but I was soon corrected.