Introduzione ai singleton di sessione

Tradotto automaticamente da Deepl

I singleton sono una delle caratteristiche principali di 4D 20 R5. In precedenza, gli sviluppatori potevano sfruttare due tipi di singleton:

  • il singleton di processo, che è unico per ogni processo ma diverso tra i vari processi,
  • e il singleton condiviso, che è unico per l’intera applicazione.

Con 4D 20 R7, stiamo rilasciando un nuovo tipo di singleton: il singleton di sessione!

Singleton di sessione HDI

Cosa sono i singleton di sessione?

I singleton di sessione sono condivisi all’interno di un’intera sessione, ma variano tra le sessioni. Sono particolarmente utili negli ambienti Web, dove le richieste di un utente vengono gestite ogni volta da processi diversi. Negli ambienti client-server, i singleton di sessione semplificano la creazione di un singleton per utente sul server, eliminando i dubbi su quale processo lo stia utilizzando.

Le sessioni in 4D

In 4D esistono 4 tipi di sessioni:

  1. Lesessioni client-server vengono create sul server 4D ogni volta che un nuovo utente si connette con un telecomando 4D.
  2. Lesessioni Web, create dal server Web per gestire le richieste HTTP dell’utente, sono disponibili solo se sono state attivate le sessioni scalabili.
  3. Sessioni REST, create dal server REST per gestire le richieste REST di un utente.
  4. La sessione di stored procedure è una sessione del server 4D che gestisce l’esecuzione di tutte le stored procedure.

Un quinto caso limite si verifica quando non esiste alcuna sessione. Si verifica solo se si esegue 4D Mono e si esegue codice al di fuori di qualsiasi richiesta web/REST.

Un caso d’uso classico: l’inventario degli oggetti

I singleton di sessione brillano in casi d’uso come i carrelli della spesa, gli elenchi di elementi: l’inventario degli articoli. Ad esempio, si consideri un inventario di oggetti in cui l’inventario di ogni utente è unico:

//class ItemInventory
    property itemList : Collection:=[]

session singleton Class constructor()

shared function addItem($item:object)
    This.itemList.push($item)

Definendo la classe ItemInventory come singleton di sessione, ogni sessione, e quindi ogni utente, ha il proprio ItemInventory. Accedere all’ItemInventory dell’utente è semplice come con qualsiasi altro tipo di singleton:

$myItemInventory:=cs.ItemInventory.me

Questo restituirà l’ItemInventory della sessione corrente da qualsiasi punto dell’applicazione. La modifica di questo ItemInventory, ad esempio aggiungendo o rimuovendo oggetti, modificherà solo l’inventariodella sessione corrente equindi dell’utente corrente.

Considerazioni chiave per i singleton di sessione

Classi condivise:

La cosa più importante da capire è che le singleton di sessione sono classi condivise, in quanto utilizzate da più processi.

Sessioni condivise:

Ultimo ma non meno importante: Se si riutilizza lo stesso cookie per una connessione web e per una connessione REST, si accederà alla stessa sessione (che passerà da una sessione web a una sessione REST) e quindi allo stesso singleton di sessione.

Conclusione

In sintesi, i singleton di sessione forniscono un modo semplice ed efficiente per gestire i dati specifici dell’utente in diverse sessioni in 4D. Questa nuova funzionalità offre una soluzione semplice e scalabile per costruire applicazioni organizzate che gestiscono in modo efficiente i dati tra le sessioni.

Se avete domande o bisogno di assistenza, non esitate a partecipare alla discussione sul forum di 4D.

Nicolas Brachfogel
- Proprietario del prodotto e sviluppatore senior - Nicolas Brachfogel è entrato in 4D nel 2017 come Senior Developer (4D Server e networking). In qualità di Product Owner per gestire il rilascio di Apple Silicon, si occupa di scrivere le storie degli utenti e di tradurle in specifiche funzionali, nonché di assicurarsi che le implementazioni delle funzionalità soddisfino le esigenze dei clienti. Diplomato all'Institut Supérieur d'Informatique Appliquée (INSIA), Nicolas ha iniziato la sua carriera come sviluppatore di software nel 2001. Dopo diversi anni di codifica in Java e C++, si è specializzato nello sviluppo di client-server per aziende di videogiochi. Come sviluppatore/architetto di server, ha lavorato con successo alle architetture server di molti giochi (Dofus Arena, Drakerz, Trivial Pursuit Go!).