Ich habe eine Repository-Klasse, die einige grundlegende Methoden zum Abrufen/Speichern/Löschen definiert. In diesen verwende ich NHibernate, um die Arbeit an meinen Geschäftseinheiten zu erledigen. Zum Beispiel:Die beste Möglichkeit, NHibernate mit dem Repository-Modell zu verwenden
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
jedoch auf meiner Benutzerklasse habe ich einige Eigenschaften und Sammlungen anderer Objekte, die im Idealfall würde Ich mag faul geladen werden. Aber natürlich wird die ISession innerhalb des Repositories erstellt und entsorgt, was wohl auch der Grund ist, dass ich beim Versuch, auf diese Eigenschaften zuzugreifen, den Fehler "Proxy kann nicht initialisiert werden - keine Sitzung" erhalten habe.
Ist meine einzige Option dann zu deaktivieren Lazy Loading bei der Verwendung von Repositories? Oder ist es möglich (oder einfach nur töricht), die Sitzung irgendwie in den Business-Layer zu integrieren?
Ich mag das Repository-Modell, und NHibernate wächst auf mich (nach vielen anfänglichen Frustration versucht, es zum Laufen zu bringen), also was ist der beste Weg, Sie Gurus gefunden haben, sie zusammen zu verwenden?
Ich bin ziemlich neu zu NHibernate und Repository-Modelle im Allgemeinen (bei der Arbeit verwenden wir immer noch hauptsächlich VB6!), Also vergeben, was eine dumme Frage sein kann. Vielen Dank.
@mookid: Danke Kumpel, das ist wirklich hilfreich, aber ich könnte es ein wenig länger offen lassen. Es ist das Backend für einen WCF-Webdienst, und alle Funktionen werden pro Anrufkontext sein, so dass eine Sitzungsdauer pro Anruf gut ist. Ich bin mir nicht sicher, wie ich so etwas in der Business-Schicht zum Laufen bringen kann. Im Idealfall möchte ich nicht, dass die Business-Objekte direkt mit NHibernate-Klassen verbunden sind. Ich denke, eine Art Wrapper für die NHibernate-Sitzung abstrahiert es zumindest ... Hmm, du hast mich zumindest auf den richtigen Weg gebracht.
Sieht aus wie das Schlüsselwort hier ist „Unit of Work“, für die eine Tonne von Ressourcen im Internet in Bezug auf NHibernate existieren. Achten Sie besonders auf Ayende's implementation in Rhino Commons und seine App Architecture Web Cast (no. 9 at Hibernating Rhinos), sehr informativ. Ich war zunächst verwirrt, weil ich eine "Unit of Work" in der Business-Schicht mischte Bedenken, but I was soon corrected.