Qual è la vostra strategia di gestione delle sessioni per NHibernate nelle applicazioni desktop?

StackOverflow https://stackoverflow.com/questions/90530

Domanda

Trovo molto più difficile gestire la sessione in un'applicazione desktop, perché non è possibile sfruttare un vincolo così chiaro come HttpContext.Quindi, come gestire la durata della sessione per sfruttare il caricamento lento ma senza avere una sessione aperta per l'intera applicazione?

È stato utile?

Soluzione

Penso che tutto si riduca al design dei tuoi oggetti.Poiché il caricamento lento può essere applicato a livello per oggetto, puoi trarre vantaggio da questo fatto quando pensi alla gestione delle sessioni.

Ad esempio, ho un sacco di oggetti ricchi di dati e caricati lentamente, e ho una visualizzazione griglia/riepilogo e una visualizzazione dettagli per essi.Nella visualizzazione di riepilogo della griglia, non utilizzo la versione dell'oggetto caricata in modo lento.Utilizzo un oggetto surrogato per presentare tali dati e tale oggetto surrogato non è caricato in modo lento.

D'altra parte, una volta che un utente seleziona il record per la visualizzazione/modifica e si accede a una visualizzazione dei dettagli a più pagine dell'oggetto, è allora che applichiamo il caricamento lento all'oggetto specifico.I dati ora vengono caricati in modo lento a seconda di quali dettagli vengono visualizzati solo su richiesta.In questo modo, l'ambito della mia sessione aperta al caricamento lento dura solo finché viene utilizzata la visualizzazione dei dettagli.

Altri suggerimenti

Ayende ha scritto di recente un ottimo articolo sull'argomento in MSDN.

Come hai detto prima, non puoi utilizzare il limite di HttpRequest, ma puoi capire cos'è una "HttpRequest" nella tua applicazione desktop.

Lasciatemi spiegare.Di solito la tua HttpRequest fungerà da controller per un'azione e limiterai la sessione a quell'azione specifica.Ora nella tua applicazione desktop i "controller" (eventi) possono essere più piccoli, ma come ha detto @Jon, una finestra può facilmente rappresentare un confine:lavori con le cose lì, lascia che siano nella tua sessione.

Forse possiamo pensare ad uno schema di comando impostato.Ogni evento significativo alimenterà e attiverà un comando e lo eseguirà.L'implementazione di base AbstractCommand.Execute() è incaricata di inizializzare la sessione, avvolgere la transazione, chiamare l'implementazione concreta SomeCommand._Execute() e chiudere tutto.

Ad ogni modo, questo è lungi dall'essere indipendente dalla persistenza, come dovrebbe essere quando ho caricato il mio oggetto e (voglio) occuparmi solo di istanze semplici (mi riferisco in particolare al caricamento lento qui).

È altrimenti possibile implementare una sorta di comportamento di apertura/chiusura automatica?Ciò dovrebbe essere ottenuto rendendo il livello di persistenza sensibile alle esigenze di query da parte di livelli superiori, anche nei casi impliciti come i trigger di caricamento lento.Per quanto riguarda la chiusura della connessione, il livello di persistenza potrebbe chiudersi dopo un determinato timeout (10 secondi?) di inattività del DB.Lo so, non è forte.Ma renderebbe davvero indipendente la persistenza degli strati superiori.

Grazie, Marcello

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