Cos' è lo stato di una applicazione? Lo stato é l' insieme dei dati e delle variabili che in una data applicazione devono essere mantenute attive o devono essere condivise da più utenti. Se fossimo in una applicazione Desktop non ci sarebbero problemi; ma nel caso di una Applicazione Web questa cosa è impossibile, poichè tramite le richieste Http che usa il browser, non siamo in grado di mantenere attive le informazioni sullo stato dell'utente o su quelle dell' applicazione.
Tramite ASP.NET siamo in grado di mantenere attivi entrambi, con diverse tecniche.

Lo Stato dell' Applicazione

Tramite l' utilizzo dell' oggetto Application siamo in grado di gestire quelle variabili in formato coppia-chiave di cui dobbiamo conoscerne lo stato durante l' esecuzione.

  Application("MyWebAppVar") = "abcdABCD"
MyLocalVar = Application("MyWebAppVar")

Questa classe eredita da HttpApplicationState viene esposta come istanza (Application) all' interno della classe Page. Quindi siccome le nostra pagine erediteranno da Page, per ogni pagina potremmo accedere intrisecamente alla proprietà Application.
Vorrei far notare che per mantenere compatibile NET con ASP Classic si può ancora usare la vecchia sintassi :

  Application.Contents("MyWebAppVar") = "abcdABCD"
MyLocalVar = Application.Contents("MyWebAppVar")

Volendo possiamo interagire con Application anche tramite due metodi esposti, Add e Remove, come nell' esempio :

  Application.Add("MyWebAppVar", "abcdABCD")
  Application.Remove("MyWebAppVar")

Infine vediamo una carrellata di tutti i metodi presenti in Application :

   'Pulisce tutto l' oggetto
   Application.Clear()
   
   'Pulisce tutto l' oggetto (per Asp Classic)
   Application.RemoveAll()
   
   'Numero di oggetti presenti
   int = Application.Count
 
  • AllKeys
    l' insieme di tutte le chiavi, dalle quali si può accedere ai singoli valori.
  • Get
    Restituisce un elemento tramite chiave e/o indice.
  • Set
    Aggiorna un elemento tramite chiave o indice.
  • GetKey
    Restituisce la chiave in base all' indice.
  • ToString
    Restituisce una stringa di quell' elemento (Viene usato per un valore stringa e non per un riferimento ad un oggetto ... ).
  • Lock e Unlock
    Con questi metodi ci assicuriamo che durante l' Accesso all' oggetto application, uno e solo un utente abbia la possibilità di modificare tale oggetto. Purtroppo con questi metodi, va a farsi benedire la Scalabilità.

Gli Static Object.

Tramite l' ausilio dell' oggetto application possiamo tenere traccia anche degli oggetti. Esempio, potremmo inserire un oggetto MyClass e voler accedere alle sue proprietà :

'Global.asax
<object runat="server" id="MyClassIstance" class="MyClass" scope="Application">
</object>


'Aspx
Response.Write("Il valore è : " & MyClassIstance.value) 

Nota : Se dobbiamo usare Application é bene istanziare a Default (0 o "") nell' evento Start di Application o Session; questo ci renderà più semplice sapere se è stato modificato o no il valore della variabile ...

Schema per l' Oggetto Application

Informazione Problema Alternativa
Stringa connessione Db A questa info ci accediamo non spesso ... La memorizziamo come variabile nel Web.Config
Dataset con consultazione frequente Utile ma attenzione all' aggiornamento Potremmo usare il modulo di gestione della cache
Variabili di contatori, Flag Ne risente la scalabilità Meglio usare un Database
Riferimenti e istanza oggetti Se lo usiamo con COM non thredabili, ne risente di gran lunga la scalabilità Assicurarsi che sia un COM Thread Safe ...

Considerazioni Finali

A parer mio bisogna tener conto anche dei seguenti fattori primadi valutare la scelta di usare l'oggetto application, inoltre vi ricordo che un uso improprio e/o errato comporta la perdita di performance e scalabilità ...

  • Durata : Le informazioni memorizzate nell' oggetto application restano vive fino alla fine dell' esecuzione dell' applicazione, ma se si spegne il server o semplicemente l' utente si disconnette queste info vanno perse ...
  • WebFarm : le informazioni dell' oggetto application non possono essere condivise tra più macchine .... Quindi non lo useremo per oggetti che devono essere disponibili a tutti.
  • Memoria : siamo tutti a conoscienza del fatto che la RAM ha un limite e se questo limite viene superato la macchina utilizza la memoria fisica ... con conseguente perdita di prestazioni.