Die beste Möglichkeit, NHibernate mit dem Repository-Modell zu verwenden

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:

%Vor%

Allerdings habe ich in meiner Benutzerklasse einige Eigenschaften und Sammlungen anderer Objekte, die ich idealerweise gerne lazy loaded hätte. 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, das Lazy Loading bei Verwendung von Repositories zu deaktivieren? Oder ist es möglich (oder einfach nur töricht), die Sitzung irgendwie in den Business-Layer einzubeziehen?

Ich mag das Repository-Modell, und NHibernate wächst auf mir (nach vielen anfänglichen Frustration Versuchen, es zum Laufen zu bringen), also was ist der beste Weg, den Gurus gefunden haben, sie zusammen zu verwenden?

Ich bin ziemlich neu bei NHibernate- und Repository-Modellen im Allgemeinen (bei der Arbeit verwenden wir immer noch hauptsächlich VB6!), also verzeiht, was vielleicht eine dumme Frage ist. Danke.

@mookid: Danke Kumpel, das ist wirklich hilfreich, aber ich lasse es vielleicht etwas länger offen. 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 wenigstens auf die richtige Spur gebracht.

Sieht aus wie das Schlüsselwort hier ist "Einheit der Arbeit", für die eine Menge Ressourcen im Web in Bezug auf NHibernate existieren. Suchen Sie insbesondere nach Ayendes Implementierung in Rhino Commons und seiner App Architecture-Webcast (Nr. 9 bei Hibernating Rhinos) , sehr informativ. Ich war anfangs verwirrt, weil ich eine "Arbeitseinheit" in die Business-Schicht einfügte, aber Bedenken, , aber ich wurde bald korrigiert.

    
Gavin 16.03.2009, 14:17
quelle

1 Antwort

12

Wenn Sie Ihre ISession erstellen und sie explizit in Ihren Repositorys ablegen, ist das für kleine und sehr einfache Projekte in Ordnung - aber wie Sie herausgefunden haben, kommt es zu kurz, wenn Sie einige der coolen Funktionen von NHibernate nutzen möchten.

Sie sollten wahrscheinlich den Lebensstil der Sitzung von etwas außerhalb Ihrer Repositories gesteuert werden lassen - 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 dann am Ende der Anforderung festschreiben und entsorgen ( oder Rollback, 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, dass Code am Anfang und am Ende jeder Anfrage aufgerufen wird. In ASP.NET MVC kann dies einfach erreicht werden, indem alle Controller von einem Basiscontroller abgeleitet werden, der seine Methoden OnActionExecuting und OnActionExecuted überschrieben hat.

    
mookid8000 16.03.2009, 14:38
quelle

Tags und Links