.net CMS
Sviluppatori > Moduli

Persistent

Modulo Persistent e sue funzionalità

Lo sviluppatore software alias il programmatore, spesso e volentieri, durante la stesura del codice, si trova impegolato a dover scrivere routine di salvataggio dati. Nel caso di una applicazione web, tale operazione è d’obbligo ogni qualvolta i dati maneggiati non siano dediti alla semplice navigazione o tracciamento utente, in tal caso ci sarebbe venuta in contro la Session di navigazione con la quale è possibile memorizzare dei valori associandoli a delle chiavi.
Per centrare il punto sulla utilità del modulo Persistent, utilizzeremo un paragone che ne renderà pienamente l’idea: Immaginiamoci di stare a scrivere un testo con il computer ed improvvisamente sala la corrente ed il computer si spegne, a questo punto tutti i dati nella memoria volatile sono andati persi, quando il computer ripartirà non vi sarà modo di ripescare il lavoro svolto a meno che questo non sia stato salvato su una unità di memoria non volatile, più comunemente nell’hard disk.
Alla stessa stregua, il nostro Plugin o la nostra personalizzazione dell’applicazione web, ogni qualvolta il server su cui gira viene riavviato o semplicemente viene fatto un riciclo del pool d’esecuzione perde tutti i dadi e gli oggetti istanziati in memoria, tale perdita non sarà recuperabile a meno che non si preveda un salvataggio di ciò che ci interessa.
Il riavvio dell’applicazione web, non è prevedibile in tutti quei casi in cui il servizio di hosting non sia pienamente sotto il nostro controllo, sovente i fornitori di servizio utilizzano routine di riavvio automatico che con frequenza riciclano il pool dell’applicazione – questo è il termine tecnico – in modo da liberare memoria che se mal gestita nel giro di breve rischierebbe di mettere in crisi il server su cui gira l’applicativo. Una operazione di questo tipo – per l’applicativo web – è metaforicamente paragonabile al classico ometto ignaro che passeggia, e all’improvviso si becca una randellata in testa da uno sconosciuto, svenendo per qualche istante, come si ripiglia non sa nemmeno dove si trova.  Global.asax – per ovviare a questo inconveniente - mette a disposizione un evento che si scaturisce ogni qualvolta l’applicazione sta per terminate, usando questo evento è possibile effettuare il salvataggio di tutto ciò che si desidera recuperare in un successivo riavvio dell’applicazione, rimano tuttavia il fatto che in qualche modo il salvataggio debba essere eseguito da delle routine scritte appositamente per il tipo di oggetto o dato che si sta maneggiando. Il modulo Persistent viene in aiuto allo sviluppatore fornendo tutta una serie di funzionalità  che provvedono a salvare dati e oggetti in maniera persistente, quindi questi saranno fruibili anche dopo il riavvio della macchina o dopo un riciclo del pool.
Per dare un’idea dell’utilità di questo modulo, basti pensare che il nocciolo stesso dell’applicativo ne fa largo uso in modo da salvare dati importanti quali per esempio l’indice degli argomenti del forum, la cache contenente le dimensioni delle immagini statiche, le news acquisite tramite i feed e i dati inerenti il link testuali venduti.
Il nostro applicativo web, ha come imperativo categorico il motto “fai del bene allo sviluppatore”, e noi abbiamo voluto raggiungere questo scopo, rendendo vita facile allo sviluppatore fornendogli tutto ciò di cui ha bisogno per lavorare in maniera veloce e snella, il modulo Persistent è frutto di questa politica. Vediamo ora nel dettaglio cosa ci offre:
In primis abbiamo le property PersistentString, PersistentInteger, PersistentSingle, PersistentDate che ci permettono di salvare e recuperare velocemente il valore di variabili di tipo stringa, interi, singola precisione e data.
L’utilizzo di queste property è abbastanza semplice ed intuitivo, a dire il vero chi legge questa guida dovrebbe perlomeno essere in grado d’arrivarci ad intuito, pena la scomunica dal rango di sviluppatore software – tuttavia noi vogliamo eccellere e quindi un esempio lo forniamo comunque!
Supponiamo che una routine abbia la necessità di dover salvare una data. Tale necessità è dovuta al fatto che non si voglia che questa routine venga eseguita più volte entro un certo lasso di tempo (supponiamo 20minuti). La cosa più ovvia e salvare il momento dell’esecuzione di tale routine, e la volta successiva recuperarlo per vedere se sono già passati 20 minuti. Per memorizzare il momento dell’esecuzione della routine si potrebbe utilizzare una variabile dichiarata come statica (Static LastExecution as Date), tuttavia il valore di tale variabile andrebbe inesorabilmente perduto in caso di riavvio dell’applicativo web, ecco quindi che anziché usare la variabile statica nella nostra funzione o metodo, useremo la procedura PersistentDate per recuperare e salvare il momento d’esecuzione della routine, il codice che andremo a scrivere sarà esattamente questo:

Dim LastExecution As Date = PersistentDate("LastExecution")
If DateDiff(DateInterval.Minute, LastExecution, Now.ToUniversalTime) < 20 Then
  PersistentDate("LastExecution ") = Now.ToUniversalTime
  REM Qui va inserita la chiamata alla routine da eseguire
End If

Il codice sopra riportato, assegna ad una variabile data il valore dell’ultima esecuzione, successivamente vede se e trascorso il tempo prestabilito affinché l’esecuzione della routine possa  ripetersi e se è il caso esegue la routine da eseguire.

PersistentDate, alla stregua delle altre procedure sopra menzionate, accetta due parametri, il primo è il nome della variabile (nel caso dell’esempio “LastExecution”), ed il secondo – non obbligatorio – è in nome del Plugin che si sta sviluppando. L’impiego del secondo parametro, benché facoltativo, è caldamente consigliato in modo da non creare conflitti con altri Plugin che potrebbero usare nomi uguali.
Nell’esempio che segue vediamo come salvare in maniera permanentemente un testo:

PersistentString("Twitt","MyPluginName") = "Hello word!"

Ed ora ecco come recuperarlo assegnandovi il valore alla variabile Twitt:

Dim Twitt As String = PersistentString ("Twitt","MyPluginName")

La lettura di variabili salvate, non generano alcun errore nel caso in cui si tenti di leggere un valore per il quale non corrisponde alcuna chiave.
Abbiamo  visto come salvare e ripescare dei semplici valori, passiamo ora alla caratteristica che maggiormente si presta nel togliere le castagne dal fuoco al povero sviluppatore che con la schiena piegata è intento nello scrivere chilometri codice,  ovvero parliamo ora delle funzionalità messe a disposizione dal modulo Persistent atte a salvare e caricare oggetti (creati da istanze di classi), assegnando loro una chiave univoca.
Per salvare qualsiasi oggetto purché XML serializzabile, possiamo fare affidamento alla funzione SaveObject(Obj As Object, Optional Key As String = Nothing, Optional SetID As Boolean = False) As String
I parametri passati alla funzione sono i seguenti:
Obj = Oggetto da salvare.
Key = Una chiave da assegnare all’oggetto, tale chiave - che rappresenta l’ID - verrà poi utilizzata per ripescare l’oggetto salvato. Questo parametro è facoltativo, e va omesso nel caso si utilizzi SetID impostato su True.
SetID = Valore booleano che se impostato su True, farà si che la chiave verrà assegnata automaticamente dalla funzione usano un numero progressivo ed evitando che si creino salvataggi con la stessa chiave. Se una stringa è stata salvata assegnandovi una chiave in automatico, la funzione LoadObject restituirà una stringa che corrisponde alla chiave assegnata automaticamente all’oggetto con il salvataggio.
Ora passiamo all’esempio pratico.
Supponiamo di avere un oggetto che rappresenti le caratteristiche di un automobile, tale oggetto viene creato da una istanza della seguente classe usando l’istruzione Dim MyCar As New Car:

Class Car
 Public Color As String
 Public Model As String
 Public Year As Integer
End Class

Una volta manipolato l’oggetto MyCar impostando i suoi attributi, lo possiamo salvare in un baleno usando l’istruzione seguente:

SaveObject(MyCat, "UsarName")

Nell’esempio sopra assegniamo all’oggetto salvato la chiave "UserName", tale chiave ci verrà utile quando poi si vorrà recuperare l’oggetto salvato per mezzo delle seguenti oistruzioni:

Dim MyCar As Car
LoadObject(MyCar, GetType(Car), "UserName")

Il metodo LoadObject, come primo parametro accetta la variabile alla quale si vuole far assegnare il valore dell’oggetto salvato, come secondo parametro occorre passare il tipo dell’oggetto salvato, che nel caso del nostro esempio, visto che la classe ha come nome Car, il tipo lo si ottiene con l’istruzione GetType(Car), e per ultimo occorrerà passare la chiave che corrisponderà alla stringa associata all’oggetto con l’operazione di salvataggio.
Va precisato che l’oggetto per poter essere salvato, dovrà essere stato istanziato da una classe XML serializzabile e verranno salvati solamente gli attributi pubblici dell’oggetto (le classi che si è soventi creare hanno questa caratteristica).
Nel caso volessimo cancellare l’oggetto salvato, niente paura, ci viene in contro la funzione DeleteObject, la quale prevede due parametri: Type, ovvero il tipo dell’oggetto che si vuole cancellare e Key, ovvero la sua chiave. Con l’istruzione che segue cancelleremo l’oggetto salvato nel precedente esempio:

Dim Deleted as Boolean = DeleteObject(GetType(Car), "UserName")

Tale funzione restituirà True nel caso in cui l’oggetto che si intenda cancellare esista realmente tra quelli salvati, altrimenti restituirà il valore booleano False senza generare alcun errore.
Per finire, accenniamo ad altre due utilissime funzioni: SaveCollection e LoadCollection con le quali è possibile salvare e caricare uno collezioni del tipo StringDictionary.
Con questa carrellata abbiamo finiti, non vi resta altro che cimentarvi nella realizzazione di stupendi e performanti Plugin ed estensioni, concentrandovi esclusivamente sulla realizzazione degli stessi. Buona Fortuna!

Argomenti nella stessa categoria