Domanda

Sto iniziando un nuovo progetto con NHibernate 3 e sto cercando di utilizzare l'API CurrentSessionContext con WebSessionContext per gestire il mio oggetto ISession.

In progetti precedenti ho sempre riuscito anch'io così ogni volta che avevo bisogno di un oggetto ISession vorrei creare e conservare in HttpContext.Items collezione. Piuttosto semplice, ma con una soluzione nativa (CurrentSessionContext) sembra una soluzione migliore per questo nuovo progetto.

Quando sono riuscito l'oggetto sono stato in grado di fare un'inizializzazione differita su di esso, il che significa che avrei aperto solo una sessione quando ne avevo bisogno e non a ogni richiesta perché non può averne bisogno e sarebbe spreco di risorse / tempo l'apertura per tutto il tempo.

C'è un modo semplice per farlo con l'API CurrentSessionContext?

Ecco il codice che sto utilizzando nel HttpModule responsabile di questo:


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

Modifica

Diego praticamente inchiodato, ma ho pensato un po 'di più su questo e mi sono ricordato il motivo principale per cui ho implementato che controllarmi:. Transazioni

Sono un Cipolla Architettura ragazzo così i miei oggetti di dominio (che sono quelli che sanno quando iniziare una transazione) non ha accesso alle infrastrutture in modo che non è possibile avviare le operazioni.

Per risolvere questo problema, io uso l'inizializzazione pigra e iniziare sempre una transazione quando si apre una sessione. Commettere accade quando le estremità di richiesta e senza eccezioni sono stati catturati. Oltre a questo, v'è il consiglio di Ayende di utilizzare sempre le operazioni, anche quando l'esecuzione di query. Ogni pensiero?

È stato utile?

Soluzione

Anche se non è direttamente rispondere alla tua domanda, penso: perché

Una sessione è un oggetto leggero. Se non ne fanno uso, semplicemente inizializza alcune strutture interne, ma non apre una connessione DB o nulla.

Ci sono alcuni esempi di tutto (solo Google) per sessioni di apertura evitare per oggetti statici in modo da risparmiare un po 'di tempo / memoria. Oltre a questo, potrebbe non essere la pena, a meno che i tuoi programmi di profiling è male le prestazioni.

Aggiornamento:. Per le esigenze di transazione, hanno uno sguardo alla realizzazione CpBT in uNhAddIns

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top