Spesso l’istanza di una classe deve essere creata una volta in tutto il progetto.
E’ possibile creare all’interno della classe stessa un metodo “GetInstance” che ritorna una variabile shared la quale punta all’unica istanza. Esempio:
Namespace BusinessLogicLayer
Public Class MiaClasse
Shared pInstance As MiaClasse
Public Shared Function GetInstance() As MiaClasse
If pInstance Is Nothing Then pInstance = New MiaClasse
Return pInstance
End Function
Private Sub New()
'Codice per inizializzare la vostra classe
'La sub new è privata, per accedere alla classe si utilizza il metodo
GetInstance.
End Sub
End Class
End NameSpace
Cosi quando volete accedere alla classe ovunque vi troviate nel codice del vostro progetto è possibile scrivere semplicemente MiaClasse.GetInstance.
I vantaggi sono diversi: non dovete mai preoccuparvi di istanziare la classe e non rischiate di creare molteplici istanze della medesima, il codice è più pulito e più leggibile.
Ma non è noioso richiamare il metodo GetInstance ogni volta che volete accedere alla vostra classe??
Per me si, allora andiamo avanti.
Il mio obbiettivo è quello di eliminare il metodo GetInstance e fare in modo che semplicemente digitando il nome della classe mi venga ritornata l’unica istanza esistente(e se non esiste si deve creare da sola) .
Così ho scritto una classe chiamata Globals che contiene le istanze Shared:
Namespace BusinessLogicLayer
Public Class Globals
Public Shared MiaClasse As New MiaClasse
End Class
End Namespace
Poi ho creato un modulo pubblico contenente una proprietà che ritorna la variabile shared della classe Globals:
Public Module MainMod
ReadOnly Property MiaClasse () As MiaClasse
Get
Return Globals.MiaClasse
End Get
End Property
End Class
Nel caso di applicazioni web non si crea la variabile shared ma si può salvare l’istanza della classe nelle variabili di sessione, non ha più senso di esistere la classe Globals:
Imports System.Web
Public Module MainMod
ReadOnly Property MiaClasse () As MiaClasse
Get
Dim Ht As HttpContext = HttpContext.Current
Dim d As MiaClasse = Ht.Session("MiaClasse ")
If d Is Nothing Then d = New MiaClasse
Return d
End Get
End Property
E’ importante includere la classe MiaClasse e Globals in un nameSpace diverso dal modulo.
Così posso creare un progetto ClassLibrary scrivere la mia Business Logic, referenziare la class Library in un altro progetto e utilizzarla semplicemente digitando il nome della classe.
Come primo post è bello incasinato. Che emozione …
… speriamo in bene per il futuro!!!
Ciao
Andrea