2009-07-30 13 views
4

Ich überprüfe Linq for NHibernate 2.1 in einer ASP.NET MVC-Anwendung zu verwenden, und ich versuche, Sitzungsverwaltung herauszufinden. Als ein erstes Experiment versuche ich, die SportsStore-Anwendung von Pro ASP.NET MVC Framework zu ändern. Diese Beispiel-App verwendet Linq zu Sql, also dachte ich, es wäre eine gute Übung. Ich habe NHibernate 2.1 Zugriff auf die Datenbank und Non-Linq-Abfragen funktionieren gut.NHibernate Linq Sitzungsverwaltung

In Linq to SQL können wir ein IQueryable-Objekt aus einem Datenkontext und einer Verbindungszeichenfolge erstellen, die herumgereicht und verwendet werden kann, ohne sich darum kümmern zu müssen, irgendeinen Kontext zu pflegen. So zum Beispiel, der ursprüngliche Produkt Repository Code liest so etwas wie:

public IQueryable<Product> Products 
{ 
    get { (new DataContext(_connectionString)).GetTable<Product>(); 
} 

und die App verwendet das zurück IQueryable Produktlist zu füllen, Produktdetails abrufen usw.

In NHibernate Linq in ähnlicher Weise ein Datum verwendet Kontext, sondern von einer Verbindungszeichenfolge liefern wir ein Session-Objekt, das in Rahmen bleiben muss, während die IQueryable in Gebrauch sind:

IQueryable<Product> products = new SportsStoreContext(session).Products; 

Also ich frage mich, wie ich die Sitzung verwalten soll, ohne zu viel Gewalt an der Struktur der Musteranwendung. Idealerweise hätte ich gerne eine Lösung, die es mir ermöglicht, Linq- und SQL-Code durch NHibernate Linq zu ersetzen, indem nur lokale Änderungen vorgenommen werden.

Eine NHibernate-Sitzung implementiert IDisposable und die meisten NHibernate-Beispiele demonstrieren die Sitzungsverwaltung mit einem Konstrukt {}, aber diese Strategie würde hier nicht funktionieren. This thread diskutiert einige verschiedene Ansätze, die S#arp Architecture und die HybridSessionBuilder. Verwendet jemand diese, um Linq zu Sql mit NHibernate Linq zu ersetzen? Gibt es andere Methoden, die besser funktionieren würden?

** EDIT mausch hat es richtig - der übliche Weg, dies zu erreichen ist mit einem httpmodul. NHibernate in Action beschreibt zwei Möglichkeiten, dies zu tun: Sitzung-pro-Anfrage (p334) und Sitzung-pro-Konversation (p340). Letzteres ermöglicht es Ihnen, persistente Instanzen über mehrere HTTP-Anfragen hinweg wiederzuverwenden. Zusätzlich zu den von mausch bereitgestellten Links erwähnt NHibernate in Action NHibernate Burrow, Castle ActiveRecord und Rhino Tools.

Antwort

4

IMO der einfachste Weg wäre ein httpmodul, das die Sitzung verwaltet (Sitzung-pro-Anfrage-Muster) und dann Dependency-Injektion verwenden, um die ISession zu den Controllern zu liefern.

Dies ist ziemlich viel the approach used by S#arp und others.

LINQ für NHibernate baut auf dem "normalen" NHibernate auf, sodass alle Sitzungsverwaltungsmuster weiterhin gelten.

Haben Sie das Buch allerdings nicht so würde ich nicht weiß, wie viel geändert werden müssen ...

+0

Richtig du bist mausch. Ich experimentiere mit Code und lese NHibernate in Action. Ich habe gerade Kapitel 10 (Architekturmuster für Persistenz) durchgelesen, wo sie auch dieses Muster beschreiben. – keithm

0

Rhino Commons ist auch eine Lösung. Ich benutze es in einer ASP.NET MVC-Anwendung funktioniert gut.

+0

In Rhino Commons ist ein Code für mehrere simultane Sitzungen, wenn Ihre Webanwendung wirklich ajaxy ist. Der Code ermöglicht, dass bei jeder Anfrage ein Sitzungstoken übergeben wird, sodass derselbe Benutzer verschiedene Transaktionen gleichzeitig ausführen kann. Verrücktheit. –