2009-03-16 4 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, и все функции будут иметь контекст для каждого вызова, поэтому время сеанса для каждого звонка будет хорошим. Просто не уверен, как добиться такой работы на бизнес-уровне, в идеале я не хочу, чтобы бизнес-объекты должны были напрямую взаимодействовать с любыми классами NHibernate. Я предполагаю, что какая-то оболочка для сеанса NHibernate, по крайней мере, абстрагирует ее ... Хм, ты по крайней мере поставил меня на правильный путь.


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

ответ

12

Создание вашего ISession и прямое размещение его в ваших хранилищах, как вы выяснили, это заканчивается, когда вы начинаете хотеть использовать некоторые из интересных функций, поддерживаемых NHibernate.

Вы должны, вероятно, позволить образ жизни сеанса контролировать что-то вне ваших хранилищ - например, если вы делаете веб-приложения ASP.NET, вы можете сохранить сеанс в текущем запросе (HttpContext.Current.Items, если я правильно помню) на время веб-запроса, а затем зафиксировать и удалить в конце запроса (или откат если возникает исключение).

Я не знаю, как лучше всего управлять образом жизни вашей сессии в приложениях ASP.NET, но должен быть какой-то способ получить код в начале и в конце каждого запроса. В ASP.NET MVC это можно легко выполнить, выведя все ваши контроллеры из базового контроллера, который переопределил его методы OnActionExecuting и OnActionExecuted.

Смежные вопросы