8 Stimmen

Der beste Weg, NHibernate mit dem Repository-Modell zu verwenden

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.

12voto

mookid8000 Punkte 17753

Eine ISession zu erstellen und sie explizit in den Repositories zu entsorgen, ist für kleine und sehr einfache Projekte in Ordnung - aber, wie Sie herausgefunden haben, greift es zu kurz, wenn Sie einige der coolen Funktionen nutzen wollen, die NHibernate unterstützt.

Sie sollten den Lebensstil der Sitzung wahrscheinlich durch etwas außerhalb Ihrer Repositories steuern lassen - wenn Sie z. B. ASP.NET-Webanwendungen erstellen, sollten Sie die Sitzung in der aktuellen Anfrage speichern ( HttpContext.Current.Items wenn ich mich richtig erinnere) für die Dauer der Webanforderung, und dann Commit und Dispose am Ende der Anforderung (oder Rollback, wenn eine Ausnahme auftritt).

Ich weiß nicht, wie man den Lebensstil einer Sitzung in ASP.NET-Anwendungen am besten steuert, aber es muss eine Möglichkeit geben, Code am Anfang und am Ende jeder Anfrage aufzurufen. In ASP.NET MVC kann dies leicht erreicht werden, indem alle Controller von einem Basiscontroller abgeleitet werden, der seine OnActionExecuting y OnActionExecuted Methoden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X