NHibernate + WCF + Windows-Dienst und WcfOperationSessionContext Klasse
- Ich habe einen Windows-Dienst-Anwendung
in dem ich Sie WCF-Dienste erstellen in es. - Eine der Dienstleistungen, die Daten
Dienstleistungen: hinzufügen, löschen,
Lesen Sie , updatte Daten über
WCF. - WCF verwenden NHibernate für Daten-manipulation
Also meine guestions sind:
-
Irgendwelche Tipps (best practice) für das session management für Hibernate mit WCF?
-
Jemand weiß etwas über
WcfOperationSessionContext (hibernate 3.0) - Klasse?
how to use it with WCF?
Gut, um es konkreter :
Nehme an, dass ich WCF-Dienst namens " DataServices
class WCFDataService .....
{
void SaveMyEntity(MyEntity entity)
{
.....................?? //How to do? Best Way
//Should i take one session and use it all times
//Should i take session and dipsose when operation finished then get
//new session for new operations?
//If many clients call my WCF service function at the same time?
//what may go wrong?
//etc....
}
}
Brauchen und ich ein NHibernateServiceProvider Klasse
class NHibernateServiceProvider ....
{
//How to get Session ?? Best way
ISession GetCurrentSession(){.... }
DisposeSession(){ ....}
}
Die Besten Wünsche
PS: ich habe gelesen, ähnliche Einträge hier und in anderen web-Seiten. Kann aber nicht sehen, "konkrete" Antworten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein post Sie beschreiben im detail, alle Schritte der Registrierung und Nutzung der WcfOperationSessionContext. Es enthält auch Anweisungen für die Verwendung mit dem agatha-rrsl Projekt.
Den WcfOperationSessionContext, ähnlich ThreadStaticSessionContext und WebRequestSessionContext ist eine Implementierung für einen session-Kontext. Der session-Kontext binden (associate) eine ISession-Instanz auf einen bestimmten Kontext.
Die Sitzung, die im aktuellen Kontext können abgerufen werden durch aufrufen von ISessionFactory.GetCurrentSession().
Finden Sie weitere Informationen über session context hier.
Den WcfOperationSessionContext stellt einen Kontext, der sich für die gesamte Dauer eines WCF-Betrieb. Sie noch behandeln müssen, die Bindung der Sitzung zu Beginn der operation und die Bindung/Begehen/Entsorgung der Sitzung am Ende der operation.
Zugang zu der begin/end-Aktionen in der wcf-pipeline, die Sie implementieren müssen, um eine IDispatchMessageInspector. Sie können sehen, ein Beispiel hier.
Auch in Bezug auf WCF-integration: wenn Sie ThreadStatic-session-Kontext erscheint es für die Arbeit an der Entwicklung, aber Sie schlagen die Wand in der Produktion, wenn die verschiedenen Komponenten (ex: Autorisierung, Authentifizierung ) von der wcf-pipeline ausgeführt werden, auf verschiedene threads.
Als für die besten Praktiken, die Sie fast nagelte ihn: Verwenden Sie WcfOperationSessionContext zum speichern der aktuellen Sitzung und der IDispatchMessageInspector zu beginnen/beenden Sie Ihre Einheit arbeiten.
BEARBEITEN - um die details, die Sie Hinzugefügt:
Wenn Sie konfiguriert WcfOperationSessionContext und tun, die verbindlich/unverbindlich, wie ich oben erklärte, alles, was Sie tun müssen, ist zu injizieren, die ISessionFactory in Ihrem Dienst und verwenden nur-Fabrik.GetCurrentSession(). Werde ich nach einer Probe prj wenn es die Zeit erlaubt.
Hier ist die Beispiel-Projekt
Modell verwenden wir für die Verwaltung von NHibernate Sitzungen mit WCF ist wie folgt:
1) Wir haben unsere eigene ServiceHost-Klasse erbt von System.ServiceModel.ServiceHost, die auch implementiert ICallContextInitializer. Wir ergänzen die service-host-Instanz zu einzelnen Vorgängen in unserem service, wie folgt:
Den BeforeInvoke macht einfach sicher, dass die OperationContext für jede WCF-call hat seine eigene Sitzung. Wir haben festgestellt, Probleme mit IDispatchMessageInspector, wo die Sitzung ist nicht verfügbar während der Reaktion serialisieren - problem, wenn man lazy loading verwenden.
2) Unsere SessionOperationContext dann rief Sie sich selbst zu befestigen und verwenden wir die OperationCompleted Veranstaltung zu entfernen uns. Auf diese Weise können wir sicher sein, dass die session verfügbar sein wird für die Reaktion serialisieren.
Wir haben die oben genannten Muster erfolgreich in high-load-Anwendungen und es scheint gut zu funktionieren.
In der Zusammenfassung dies ist ähnlich zu dem, was die neue WcfOperationSessionContext hat (es war nicht herum, wenn wir herausgefunden das Muster oben; -)), aber auch das überwindet die Probleme rund um lazy-loading.
In Bezug auf die zusätzlichen Fragen: Wenn Sie das Modell oben skizzierten Sie würde einfach Folgendes tun:
Werden Sie garantiert, dass die Sitzung immer da ist und dass es entsorgt werden, sobald das WCF operation abgeschlossen ist. Sie können Transaktionen verwenden, wenn erforderlich, in der üblichen Weise.
Ok, nach ein paar Tagen von dem Lesen der internet-Beiträge etc. alle Ansätze gezeigt, in der die Möglichkeiten des internets scheint falsch zu sein. Wenn wir mit UnitOfWork-pattern mit NH 3^ mit nhibernate Transaktion dieses allen aprochaes produzieren Ausnahmen. Um es zu testen und den Nachweis, dass wir brauchen, um zu erstellen-Testumgebung mit MSMQ-Transaktion queue spezielle Schnittstelle mit OneWay-Betrieb Vertrag mit der Transaktion erforderlich festgelegt sind. Dieser Ansatz sollte funktioniert wie folgt:
1. Wir setzen die transaktional-Nachricht in der Warteschlange.
2. Service ist immer transaktional messege aus der Warteschlange.
3. Alles funktioniert, die Warteschlange ist leer.
In einigen Fällen nicht so obious mit internet Ansätzen funktioniert das nicht richtig. So, hier sind expamples, die wir getestet, die sind falsch und warum:
Was ist die Lösung?
IOperationInvoker und nur diese!
Müssen Sie diese Schnittstelle implementieren, wie ein Dekorator-Muster auf Standard-invoker. In der Methode Aufrufen, bevor der Anruf wir sind openning Sitzung/Transaktion offen ist, dann rufen Sie invoke Standard-invoker und danach rufen Sie die Transaktion.komplett in endlich clausule wir call session.flush. Welche Arten der dieses problem löst:
1. Wir haben Transaktionsbereich auf dieser Ebene, also wenn Sie fertig ist, wirft exception, gehen zurück in die Warteschlange und WCF wird nicht Herunterfahren.
2. Beim Aufruf throw Ausnahme-Transaktion.abgeschlossen werden nicht genannt, was nicht zu ändern Datenbank-Zustand
Ich hoffe, das wird klar, jedermanns missinformation.
In einigen freien Zeit werde ich versuchen, einige schreiben Beispiel.