2010-12-30 7 views
2

Ich brauche einige Einblicke und Gedanken über ein Refactoring, das ich in unserer Web-App machen werde.Monorail, Nhibernate und Session-pro-Request-Muster

Anfangs verwendeten wir das Session-pro-Request-Muster mit NHibernate und ActiveRecord, indem wir in der HttpApplication On_BeginRequest/On_EndRequest verwendeten, um die Sitzung zu erstellen und zu verwerfen. Später stellten wir fest, dass jegliche DB-bezogenen Ausnahmen außerhalb unseres Monorail-Kontextes geworfen wurden, was bedeutet, dass unsere Rettungen nicht in Kraft traten. Als weiteren Nebeneffekt hatten wir keine Möglichkeit, die Erstellung von NHibernate-Sitzungen in allen vollständig zu überspringen Aktion, die in einigen Fällen wünschenswert wäre.

Also haben wir es neu geschrieben, um Sitzungen in Initialize()/Contextualize() in unserem Basis-Controller zu erstellen, und sie in der Dispose() unseres Basis-Controllers angeordnet. Wir führen auch eine Rollback-Sitzung in unserem Rettungs-Controller durch, um halbierte Änderungen an der DB zu verhindern. So weit, ist es gut. Der Grund dafür, dies in Dispose() zu tun, liegt darin, dass wir das View-Rendering aufgrund von Lazy-Loading-Gründen sowie View-Komponenten, die eine Session benötigen, durchleben müssen (wir könnten für die viewcomponents, aber sie scheinen kein Dispose() ...)

Ich habe jedoch einige Deadlock-Probleme, wo wir Transactions in der DB gestartet haben, die nicht Rollbacked noch verpflichtet und ich kann ‚t bekommen meinen Kopf um ihn herum, vor allem wegen der Unordnung wir mit diesem Ansatz gemacht haben ...

So fand ich diesen Artikel: http://hackingon.net/post/NHibernate-Session-Per-Request-with-ASPNET-MVC.aspx

Und ich dachte,„Filter, das können wir verwenden in MonoRail auch! ", Bec ause kann es auf BeforeAction und AfterRendering treten.

Meine Fragen dann sind:

  1. Was passiert, wenn eine Ausnahme in dem Filter auftritt?
  2. Wird AfterRendering ausgelöst, auch wenn eine Ausnahme in der Aktion oder beim Rendern auftritt?
  3. Würden Sie diesen Ansatz empfehlen, wenn nicht, was schlagen Sie stattdessen vor?

Alle Zeiger werden sehr geschätzt!

+0

Haben Sie versucht, die NHibernate-Funktion zu verwenden? –

+0

Wir verwenden die ActiveRecordFacility, aber ich fühle mich nicht wohl mit dem TransactionScope-Weg, weil ich keine Ahnung von den Sitzungen habe erstellt oder entsorgt. Ich habe lieber meinen eigenen Wrapper, der die sessionFactory verwendet und bei Bedarf eine Sitzung erstellt. Ich hoffe, dass ich "session-per-request" - und "unit-of-work" -Muster in demselben Wrapper implementieren könnte. Wie würde mir die NHibernate-Einrichtung in diesem Szenario helfen? – jishi

+0

Entschuldigung, habe die Erwähnung von ActiveRecord nicht gesehen. Ja, entweder ActiveRecordFacility oder NHibernateFacility, nicht beides. Haben Sie für die Transaktionen die Automatic Transaction Management Facility ausprobiert? –

Antwort

1
  1. Sie benötigen einen Anwendungsfehlerhandler, der die Ausnahmebehandlung behandelt.

  2. Fügen Sie einen Debugger hinzu und finden Sie es heraus.

  3. Wahrscheinlich nicht (obwohl es mein Artikel ist). Es funktioniert nicht mit RenderAction. Am besten verwenden Sie einen IoC-Container, um die Lebensdauer von Verbindungen zu kontrollieren.