Ich habe eine Repository-Klasse, die einige grundlegende Get/Save/Delete-Methoden definiert. Innerhalb dieser Methoden verwende ich NHibernate, um die Arbeit an meinen Geschäftseinheiten zu erledigen. Zum Beispiel:
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
Allerdings habe ich in meiner User-Klasse einige Eigenschaften und Sammlungen von anderen Objekten, die ich idealerweise gerne "lazy" laden würde. Aber natürlich wird die ISession innerhalb des Repositorys erstellt und entsorgt, was wohl der Grund dafür ist, dass ich, wenn ich versuche, auf diese Eigenschaften zuzugreifen, den Fehler "Could not initialize proxy - no Session" erhalte.
Bleibt mir also nur die Möglichkeit, das "Lazy Loading" bei der Verwendung von Repositories zu deaktivieren? Oder ist es möglich (oder nur dumm), irgendwie die Sitzung in den Anwendungsbereich in der Business-Schicht zu bekommen?
Ich mag das Repository-Modell, und NHibernate wächst auf mich (nach viel anfängliche Frustration versuchen, es zum Laufen zu bringen), so was ist der beste Weg, den Sie Gurus gefunden haben, um sie zusammen zu verwenden?
Ich bin ziemlich neu in NHibernate und Repository-Modelle im Allgemeinen (bei der Arbeit verwenden wir noch hauptsächlich VB6!), so verzeihen, was eine dumme Frage sein kann. Danke!
@mookid: Danke Kumpel, das ist wirklich hilfreich, aber ich werde es vielleicht noch ein bisschen länger offen lassen. Es ist das Back-End zu einem WCF-Webdienst, und alle Funktionen werden pro-Aufruf-Kontext, so dass eine pro-Aufruf-Session-Leben gut sein wird. Ich bin mir nur nicht sicher, wie ich so etwas in der Geschäftsschicht hinbekomme. Idealerweise möchte ich nicht, dass die Geschäftsobjekte eine direkte Schnittstelle zu NHibernate-Klassen haben. Ich schätze, eine Art Wrapper für die NHibernate-Session abstrahiert sie zumindest... Hmm, Sie haben mich zumindest auf die richtige Spur gebracht.
Das Schlüsselwort hier scheint "Unit of Work" zu sein, zu dem es im Web eine Menge von Ressourcen in Bezug auf NHibernate gibt. Suchen Sie insbesondere nach Ayendes Umsetzung in Rhino Commons, und sein App Architecture Webcast (Nr. 9 bei den Nashörnern im Winterschlaf) , sehr informativ. Ich war zunächst verwirrt, weil ich dachte, eine "Unit of Work" in der Geschäftsschicht zu platzieren, bedeute, Bedenken zu vermischen, aber ich wurde bald korrigiert.