V režimu klient-server vaše logika často vyžaduje zdroje hostované na serveru. Chcete-li spustit kód na serveru, jste zvyklí psát speciální metody projektu nebo funkce datového modelu ORDA.
To může vést k velkému počtu metod projektu nebo funkcí datového modelu ORDA, které nejsou vždy opodstatněné.
S 4D 21 R3 mohou některé singletony nyní mít funkce spouštěné na serveru.
Čtěte dál a dozvíte se, jak zlepšit organizaci svého kódu!
Ve vašich desktopových aplikacích musí být určité části kódu prováděny na serveru, protože čtou nebo aktualizují data, která musí být sdílená všemi připojenými klienty 4D. Například pro sdílení dat v paměti mezi všemi připojenými klienty můžete v současné době používat úložiště na serveru.
Vaše logika může také vyžadovat zdroje hostované na serveru (např. dotazování dat).
Pro spuštění kódu na serveru jste byli zvyklí psát:
- metodu projektu s povolenou vlastností Execute on server
- příkaz Execute on server
- funkce datového modelu ORDA (která se ve výchozím nastavení provádí na serveru)
Nyní mohou některé singletony mít funkce, které se vždy provádějí na serveru.
Klíčové slovo server pro sdílené a relační singletony
Funkce ve sdílených a relačních singletonech nyní podporují klíčové slovo server .
Je-li funkce deklarována s tímto klíčovým slovem „ server “, je vždy prováděna na serveru, i když je singleton instancován na 4D Client.
Příklad
V následujícím příkladu definuje sdílený singleton Administration funkci server funkci, která spouští příkaz Process activity().
Tento singleton je instancován na 4D Client a funkce je volána odtud. Vrací aktivitu ze serveru (procesy + relace).
Sdílený singleton 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()
Kód běžící na 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)
Pokračování se singletonem relace
V tomto kontextu poskytuje singleton relace významnou výhodu. Singleton relace má jedinečnou sdílenou instanci pro všechny procesy v rámci relace.
Jakmile singleton relace dokáže provádět logiku na serveru, může efektivně rozšířit možnosti příkazu Session .
Příklad
Pokud ukládáte své uživatele do tabulky Users a implementujete vlastní ověřování, můžete k tomuto účelu použít singleton relace.
V následujícím příkladu má singleton relace UserSession funkci checkUser() prováděnou na serveru. ID uživatele je uloženo ve sdíleném objektu relace storage sdíleném objektu.
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
Aby byl aktuální uživatel k dispozici všem klientům 4D, singleton relace zpřístupňuje vypočítanou vlastnost user načtenou ze serveru.
session singleton Class constructor()
server Function get user() : cs.UsersEntity
return ds.Users.get(Session.storage.userInfo.userId)
Spusťte přiložený HDI a prozkoumejte konkrétní příklady. Dalším krokem je lepší organizace kódu umístěním příslušné logiky do vhodné třídy a… neváhejte a začněte pracovat se 4D relacemi!
K tomuto příspěvku zatím nelze přidávat komentáře.