У меня есть класс репозитория, который определяет некоторые основные методы Get / Save / Delete. Внутри них я использую 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. В частности, обратите внимание на реализацию Айенде в Rhino Commons и его веб-трансляцию архитектуры приложений (№ 9 в Hibernating Rhinos) , очень информативную. Сначала я был в замешательстве, потому что я, хотя включение «Единицы работы» в бизнес-уровень смешивало проблемы, , но вскоре меня исправили.