Nella modalità client-server, la logica spesso richiede risorse ospitate sul server. Per eseguire codice sul server, si è soliti scrivere metodi di progetto dedicati o funzioni del modello dati ORDA.
Ciò può portare a un numero elevato di metodi di progetto o funzioni del modello dati ORDA non sempre giustificati.
Con 4D 21 R3, alcuni singleton possono ora avere funzioni eseguite sul server.
Continua a leggere per scoprire come migliorare l’organizzazione del tuo codice!
Nelle applicazioni desktop, alcune parti del codice devono essere eseguite sul server perché leggono o aggiornano dati che devono essere condivisi da tutti i client 4D connessi. Ad esempio, per condividere i dati in memoria tra tutti i client connessi, attualmente è possibile utilizzare lo Storage sul server.
La tua logica potrebbe anche richiedere risorse ospitate sul server (ad es. l’interrogazione dei dati).
Per eseguire il codice sul server, eravate abituati a scrivere:
- un metodo di progetto con la proprietà Esegui sul server abilitata
- un comando Execute on server
- una funzione del modello dati ORDA (che viene eseguita sul server per impostazione predefinita)
Ora, alcuni singleton possono avere funzioni che vengono sempre eseguite sul server.
La parola chiave server per i singleton condivisi e di sessione
Le funzioni nei singleton condivisi e di sessione ora supportano la server .
Quando una funzione viene dichiarata con questa parola chiave ” server “, viene sempre eseguita sul server, anche se il singleton è istanziato su un 4D Client.
Esempio
Nell’esempio seguente, il singleton condiviso Administration definisce una server funzione che esegue il comando Process activity().
Questo singleton viene istanziato su un 4D Client e la funzione viene chiamata da lì. Restituisce l’attività dal server (processi + sessioni).
Il singleton condiviso Administration:
shared singleton Class constructor
// This function is executed on the server
server Function processActivity() : Object
return Process activity()
// This function is executed locally
Function localProcessActivity() : Object
return Process activity()
Codice in esecuzione sul 4D Client:
var $localActivity; $serverActivity : Object
var $administration : cs.Administration
ASSERT(Application type()=4D Remote mode)
// The Administration singleton is instantiated on the 4D Client
$administration:=cs.Administration.me
// Get the processes running on the 4D client
$localActivity:=$administration.localProcessActivity()
ASSERT($localActivity.sessions=Null)
// Get the processes + sessions running on 4D Server
$serverActivity:=$administration.processActivity()
ASSERT($serverActivity.sessions.length>=1)
Approfondimento sul singleton di sessione
In questo contesto, il singleton di sessione offre un vantaggio significativo. Un singleton di sessione dispone di un’istanza condivisa unica per tutti i processi all’interno di una sessione.
Non appena un singleton di sessione è in grado di eseguire la logica sul server, può estendere efficacemente le funzionalità del comando Session .
Esempio
Se si memorizzano gli utenti in una tabella Users e si implementa l’autenticazione personalizzata, è possibile utilizzare un singleton di sessione a questo scopo.
Nell’esempio seguente, il singleton di sessione UserSession ha una funzione checkUser() eseguita sul server. L’ID utente è memorizzato nell’oggetto condiviso della sessione storage oggetto condiviso.
server Function checkUser($credentials : Object) : Boolean
var $user : cs.UsersEntity
var $result:=False
If ($credentials#Null)
$user:=ds.Users.query("Email === :1"; $credentials.identifier).first()
If (($user#Null) && (Verify password hash($credentials.password; $user.Password)))
Use (Session.storage)
Session.storage.userInfo:=New shared object("userId"; $user.ID)
End use
$result:=True
End if
End if
return $result
Per fornire l’utente corrente a tutti i client 4D, il singleton di sessione espone una proprietà calcolata user recuperata dal server.
session singleton Class constructor()
server Function get user() : cs.UsersEntity
return ds.Users.get(Session.storage.userInfo.userId)
Eseguite l’HDI allegato per esplorare esempi concreti. Il passo successivo consiste nell’organizzare meglio il vostro codice collocando la logica pertinente nella classe appropriata e… non aspettate oltre per iniziare a lavorare con le sessioni 4D!
Al momento non è possibile lasciare commenti su questo post.