No modo cliente-servidor, a sua lógica requer frequentemente recursos alojados no servidor. Para executar código no servidor, está habituado a escrever métodos de projeto dedicados ou funções do modelo de dados ORDA.
Isto pode levar a um grande número de métodos de projeto ou funções do modelo de dados ORDA que nem sempre se justificam.
Com o 4D 21 R3, alguns singletons podem agora ter funções executadas no servidor.
Continue a ler para saber como melhorar a organização do seu código!
Nas suas aplicações de desktop, certas partes do código devem ser executadas no servidor porque lêem ou atualizam dados que precisam de ser partilhados por todos os Clientes 4D ligados. Por exemplo, para partilhar dados na memória entre todos os clientes ligados, pode atualmente utilizar o Armazenamento no servidor.
A sua lógica também pode requerer recursos hospedados no servidor (por exemplo, consultar dados).
Para executar código no servidor, estava habituado a escrever:
- um método de projeto com a propriedade Executar no servidor ativada
- um comando Execute on server
- funções do modelo de dados ORDA (que são executadas no servidor por predefinição)
Agora, alguns singletons podem ter funções que são sempre executadas no servidor.
A palavra-chave «server» para singletons partilhados e de sessão
As funções em singletons partilhados e de sessão suportam agora a server .
Quando uma função é declarada com esta palavra-chave « server », é sempre executada no servidor, mesmo que o singleton seja instanciado num 4D Client.
Exemplo
No exemplo abaixo, o singleton partilhado Administration define uma server função que executa o comando Process activity().
Este singleton é instanciado num 4D Client, e a função é chamada a partir daí. Ela retorna a atividade do servidor (processos + sessões).
O singleton partilhado 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()
Código em execução no 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)
Aprofundando o singleton de sessão
Neste contexto, o singleton de sessão oferece uma grande vantagem. Um singleton de sessão possui uma instância partilhada única para todos os processos dentro de uma sessão.
Assim que um singleton de sessão consegue executar lógica no servidor, pode efetivamente alargar as capacidades do comando ` Session `.
Exemplo
Se armazenar os seus utilizadores numa tabela Users e implementar uma autenticação personalizada, pode utilizar um singleton de sessão para este fim.
No exemplo abaixo, o singleton de sessão UserSession tem uma função checkUser() executada no servidor. O ID do utilizador é armazenado no storage objeto partilhado.
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
Para disponibilizar o utilizador atual a todos os clientes 4D, o singleton de sessão expõe uma propriedade calculada user recuperada do servidor.
session singleton Class constructor()
server Function get user() : cs.UsersEntity
return ds.Users.get(Session.storage.userInfo.userId)
Execute o HDI em anexo para explorar exemplos concretos. O próximo passo é organizar melhor o seu código, colocando a lógica relevante na classe apropriada e… não espere para começar a trabalhar com sessões 4D!
De momento, não é possível deixar comentários nesta publicação.