2009-03-16 11 views
8

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.

Antwort

12

Erstellen Sie Ihre ISession und Entsorgen es explizit in Ihre Repositories wie das ist ok für kleine und sehr einfache Projekte - aber, Wie Sie herausgefunden haben, kommt es zu kurz, wenn Sie einige der coolen Funktionen nutzen möchten, die NHibernate unterstützt.

Sie sollten wahrscheinlich den Lebensstil der Sitzung von etwas außerhalb Ihrer Repositorys gesteuert werden - z. Wenn Sie ASP.NET-Webanwendungen ausführen, möchten Sie möglicherweise die Sitzung in der aktuellen Anforderung (HttpContext.Current.Items, wenn ich mich richtig erinnere) für die Dauer der Webanforderung speichern und anschließend am Ende der Anforderung festschreiben und ablehnen (oder zurücksetzen) wenn eine Ausnahme auftritt).

Ich kenne nicht den besten Weg, um den Lebensstil Ihrer Sitzung in ASP.NET-Anwendungen zu steuern, aber es muss eine Möglichkeit geben, Code am Anfang und am Ende jeder Anfrage aufgerufen werden. In ASP.NET MVC kann dies leicht erreicht werden, indem alle Ihre Controller von einem Basiscontroller abgeleitet werden, der seine Methoden OnActionExecuting und OnActionExecuted überschrieben hat.

Verwandte Themen