Question

Je commence un nouveau projet avec NHibernate 3 et je suis en train d'utiliser l'API CurrentSessionContext avec WebSessionContext pour gérer mon objet ISession.

Dans les projets précédents, je toujours réussi moi-même si chaque fois que je besoin d'un objet ISession je créer et stocker dans la collection HttpContext.Items. Assez simple, mais en utilisant une solution native (CurrentSessionContext) semble être une meilleure option pour ce nouveau projet.

Quand je réussi l'objet que j'ai pu faire une initialisation paresseuse à ce sujet, ce qui signifie que j'ouvrir seulement une session quand je avais besoin et non pas dans chaque demande parce que je ne peux pas avoir besoin et perdrions ressources / temps par ouvrir tout le temps.

Y at-il un moyen simple de le faire avec l'API CurrentSessionContext?

Voici le code que je utilise dans le HttpModule responsable de ceci:


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();
    }
}

Modifier

Diego à peu près clouée, mais je pensais un peu plus à ce sujet et je me suis souvenu de la principale raison pour laquelle je contrôle moi-même mis en œuvre que:. Transactions

Je suis le gars de oignon architecture si mes objets de domaine (qui sont ceux qui savent quand commencer une transaction) ne dispose pas d'accès à l'infrastructure afin qu'ils ne peuvent pas démarrer les transactions.

Pour résoudre ce problème, j'utiliser l'initialisation paresseux et toujours démarrer une transaction lors de l'ouverture d'une session. Se produit lorsque les engager extrémités de demande et aucune exception n'a été pris. En outre, il y a des conseils de Ayende toujours utiliser les transactions, même lors de l'interrogation. Toute pensée?

Était-ce utile?

La solution

Alors pas directement répondre à votre question, je pense: pourquoi

Une session est un objet léger. Si vous ne l'utilisez pas, il initialise juste quelques structures internes, mais il ne s'ouvre pas une connexion DB ou quoi que ce soit.

Il y a quelques exemples autour (juste Google) pour éviter les séances d'ouverture pour les objets statiques afin d'économiser un peu de temps / mémoire. En dehors de cela, il pourrait ne pas valoir la peine, à moins que vos spectacles de profilage, il est nuire à votre performance.

Mise à jour:. Pour les besoins de la transaction, ont un regard sur la mise en œuvre cPBT dans uNhAddIns

scroll top