Frage

Ich beginne ein neues Projekt mit NHibernate 3 und ich versuche, die CurrentSessionContext API mit WebSessionContext zu verwenden, um mein ISession Objekt zu verwalten.

In früheren Projekten ich es immer geschafft, dass mir so, wenn ich brauchte ein ISession Objekt ich es und speichern Sie in HttpContext.Items Sammlung schaffen würde. Ziemlich einfach, aber mit einer nativen Lösung (CurrentSessionContext) scheint wie eine beste Option für dieses neue Projekt.

Wenn ich es geschafft, das Objekt konnte ich eine faule Initialisierung auf, es zu tun, was bedeutet, dass ich nur eine Session öffnen würde, wenn ich sie brauchte und nicht in jeder Anforderung, weil ich es vielleicht nicht brauchen, und würde verschwenden Ressourcen / Zeit Öffnen sie die ganze Zeit.

Gibt es eine einfache Art und Weise, mit der CurrentSessionContext API zu tun?

Hier ist der Code, den ich in der Httpmodule dafür verantwortlich bin mit:


public class ContextualSessionModule : IHttpModule
{

    public void Init(HttpApplication context)
    {
        context.BeginRequest += context_BeginRequest;
        context.EndRequest += context_EndRequest;
    }

    public void Dispose()
    {
    }

    private static void context_BeginRequest(object sender, EventArgs e)
    {
        var application = (HttpApplication)sender;
        var context = application.Context;

        BindSession(context);
    }

    private static void BindSession(HttpContext context)
    {
        // Create a new session (it's the beginning of the request)
        var session = SessionBuilderFactory.CurrentSessionFactory.OpenSession();

        // Tell NH session context to use it
        CurrentSessionContext.Bind(session);
    }

    private static void context_EndRequest(object sender, EventArgs e)
    {
        var application = (HttpApplication)sender;
        var context = application.Context;

        UnbindSession(context);
    }

    private static void UnbindSession(HttpContext context)
    {
        // Get the default NH session factory
        var factory = SessionBuilderFactory.CurrentSessionFactory;

        // Give it to NH so it can pull the right session
        var session = CurrentSessionContext.Unbind(factory);

        if (session == null) return;
        session.Flush();
        session.Close();
    }
}

Bearbeiten

Diego ziemlich genagelt, aber ich dachte, ein bisschen mehr über diese und ich erinnerte mich den Hauptgrund, warum ich diese Kontrolle durchgeführt selbst. Transaktionen

Ich bin eine Onion Architektur Kerl so meine Domain-Objekte (wer sind diejenigen, die wissen, wann eine Transaktion starten) hat keinen Zugang zu Infrastruktur, so dass sie keine Transaktionen beginnen.

Um dies zu lösen, verwende ich faul Initialisierung und immer eine Transaktion starten, wenn eine Sitzung zu öffnen. Begehen passiert, wenn die Anfrage Enden und keine Ausnahmen gefangen wurden. Daneben gibt es Ayende Rat immer Transaktionen verwenden, auch bei der Abfrage. Irgendwelche Gedanken?

War es hilfreich?

Lösung

Während nicht direkt die Beantwortung Ihrer Frage, ich denke: Warum

Eine Sitzung ist eine leichte Aufgabe. Wenn Sie es nicht verwenden, es initialisiert nur einige interne Strukturen, aber es ist nicht eine DB-Verbindung oder irgendetwas nicht öffnen.

Es gibt einige Beispiele um (nur Google) zu vermeiden Öffnung Sitzungen für statische Objekte, um einen wenig Zeit / Speicher zu sparen. Abgesehen davon, ist es nicht wert sein, könnte es, es sei denn, Ihre Profilierung zeigt es Ihre Leistung ist verletzt.

Update:. Für Transaktionsanforderungen, haben einen Blick auf die CpBT Implementierung in uNhAddIns

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top